package system

import (
	"context"

	"github.com/go-kratos/kratos/v2/log"
)

// Db 数据库信息
type Db struct {
	Database string `json:"database" gorm:"column:database"`
}

// Table 表信息
type Table struct {
	TableName string `json:"tableName" gorm:"column:table_name"`
}

// Column 列信息
type Column struct {
	ColumnName    string `json:"columnName" gorm:"column:column_name"`
	DataType      string `json:"dataType" gorm:"column:data_type"`
	DataTypeLong  string `json:"dataTypeLong" gorm:"column:data_type_long"`
	ColumnComment string `json:"columnComment" gorm:"column:column_comment"`
	PrimaryKey    int    `json:"primaryKey" gorm:"column:primary_key"`
}

// DBInfo 数据库配置信息
type DBInfo struct {
	AliasName string `json:"aliasName"`
	DBName    string `json:"dbName"`
	Disable   bool   `json:"disable"`
	DBType    string `json:"dbtype"`
}

// AutoCodeRepo 自动代码仓储接口
type AutoCodeRepo interface {
	GetDB(ctx context.Context, businessDB string) ([]Db, error)
	GetTables(ctx context.Context, businessDB, dbName string) ([]Table, error)
	GetColumn(ctx context.Context, businessDB, tableName, dbName string) ([]Column, error)
	GetDBList() []DBInfo
	GetActiveDBName(businessDB string) string
}

// AutoCodeUsecase 自动代码用例
type AutoCodeUsecase struct {
	repo AutoCodeRepo
	llm  *AutoCodeLLMUsecase
	log  *log.Helper
}

// NewAutoCodeUsecase 创建自动代码用例
func NewAutoCodeUsecase(repo AutoCodeRepo, llm *AutoCodeLLMUsecase, logger log.Logger) *AutoCodeUsecase {
	return &AutoCodeUsecase{
		repo: repo,
		llm:  llm,
		log:  log.NewHelper(logger),
	}
}

// GetDB 获取所有数据库
func (uc *AutoCodeUsecase) GetDB(ctx context.Context, businessDB string) ([]Db, error) {
	return uc.repo.GetDB(ctx, businessDB)
}

// GetTables 获取指定数据库的所有表
func (uc *AutoCodeUsecase) GetTables(ctx context.Context, businessDB, dbName string) ([]Table, error) {
	return uc.repo.GetTables(ctx, businessDB, dbName)
}

// GetColumn 获取指定表的所有列
func (uc *AutoCodeUsecase) GetColumn(ctx context.Context, businessDB, tableName, dbName string) ([]Column, error) {
	return uc.repo.GetColumn(ctx, businessDB, tableName, dbName)
}

// GetDBList 获取配置的数据库列表
func (uc *AutoCodeUsecase) GetDBList() []DBInfo {
	return uc.repo.GetDBList()
}

// GetActiveDBName 获取当前活动的数据库名
func (uc *AutoCodeUsecase) GetActiveDBName(businessDB string) string {
	return uc.repo.GetActiveDBName(businessDB)
}

// LLMAuto 大模型自动生成代码
func (uc *AutoCodeUsecase) LLMAuto(ctx context.Context, llm map[string]interface{}) (interface{}, error) {
	return uc.llm.LLMAuto(ctx, llm)
}
