package vector

import (
	"database/sql"
	"fmt"
	"godo/ai/vector/model"
	"godo/libs"
	"os"

	_ "github.com/ncruces/go-sqlite3/embed"
	"github.com/ncruces/go-sqlite3/gormlite"
	"gorm.io/gorm"
)

var vectorListDb *gorm.DB
var dbPathToSqlDB = make(map[string]*sql.DB)

func init() {
	dbPath := libs.GetVectorDb()
	db, err := gorm.Open(gormlite.Open(dbPath), &gorm.Config{})
	if err != nil {
		return
	}
	vectorListDb = db
}

// CreateVector 创建一个新的 VectorList 记录
func CreateVector(name string, filePath string) (*gorm.DB, error) {
	dbPath := libs.GetVectorPath(name)
	var list model.VectorList

	// 检查是否已经存在同名的 VectorList
	result := vectorListDb.Where("name = ?", name).First(&list)
	if result.Error == nil {
		return nil, fmt.Errorf("vector list with the same name already exists")
	}

	// 创建新的 VectorList 记录
	newList := model.VectorList{
		Name:     name,
		FilePath: filePath, // 根据实际情况设置文件路径
		DbPath:   dbPath,
	}

	result = vectorListDb.Create(&newList)
	if result.Error != nil {
		return nil, result.Error
	}

	return vectorListDb, nil
}

// DeleteVector 删除指定名称的 VectorList 记录
func DeleteVector(name string) error {
	result := vectorListDb.Where("name = ?", name).Delete(&model.VectorList{})
	if result.Error != nil {
		return result.Error
	}
	if result.RowsAffected == 0 {
		return fmt.Errorf("vector list not found")
	}

	// 关闭数据库连接
	err := CloseVectorDb(name)
	if err != nil {
		return fmt.Errorf("failed to close vector database: %w", err)
	}
	// 删除数据库文件
	dbPath := libs.GetVectorPath(name)
	if libs.PathExists(dbPath) {
		err := os.Remove(dbPath)
		if err != nil {
			return fmt.Errorf("failed to delete database file: %w", err)
		}
	}

	return nil
}

// CloseVectorDb 关闭指定名称的 Vector 数据库连接
func CloseVectorDb(name string) error {
	dbPath := libs.GetVectorPath(name)
	if !libs.PathExists(dbPath) {
		return nil
	}
	sqlDB, exists := dbPathToSqlDB[dbPath]
	if !exists {
		return fmt.Errorf("no database connection found for path: %s", dbPath)
	}
	err := sqlDB.Close()
	if err != nil {
		return fmt.Errorf("failed to close database connection: %w", err)
	}

	delete(dbPathToSqlDB, name)
	return sqlDB.Close()
}

// RenameVectorDb 更改指定名称的 VectorList 的数据库名称
func RenameVectorDb(oldName string, newName string) error {
	// 1. 检查并关闭旧的数据库连接(如果已打开)
	err := CloseVectorDb(oldName)
	if err != nil {
		return fmt.Errorf("failed to close vector database: %w", err)
	}

	// 2. 获取旧的 VectorList 记录
	var oldList model.VectorList
	result := vectorListDb.Where("name = ?", oldName).First(&oldList)
	if result.Error != nil {
		return fmt.Errorf("failed to find old vector list: %w", result.Error)
	}
	//3. 删除旧的数据库文件
	oldDbPath := libs.GetVectorPath(oldName)
	// 4. 构建新的 DbPath
	newDbPath := libs.GetVectorPath(newName)
	if libs.PathExists(oldDbPath) {
		err := os.Rename(oldDbPath, newDbPath)
		if err != nil {
			return fmt.Errorf("failed to move old database file to new location: %w", err)
		}
	}

	// 5. 更新 VectorList 记录中的 DbPath 和 Name
	oldList.Name = newName
	oldList.DbPath = newDbPath
	result = vectorListDb.Save(&oldList)
	if result.Error != nil {
		return fmt.Errorf("failed to update vector list: %w", result.Error)
	}

	return nil
}

// UpdateVector 更新指定名称的 VectorList 记录
func UpdateVector(name string, updates map[string]interface{}) error {
	result := vectorListDb.Model(&model.VectorList{}).Where("name = ?", name).Updates(updates)
	if result.Error != nil {
		return result.Error
	}

	if result.RowsAffected == 0 {
		return fmt.Errorf("vector list not found")
	}

	return nil
}
func GetVectorList() []model.VectorList {
	var vectorList []model.VectorList
	vectorListDb.Find(&vectorList)
	return vectorList
}