// Package llm 映射外部 LLM 配置中心 MySQL 的三张表
//
// 严格只读：本服务永远不应该 INSERT / UPDATE / DELETE 这些表，
// DAO 中只用 Find / First / Where。所有写操作由配置中心自身负责。
package llm

import "time"

// 模型类型枚举（对应 t_llm_model.model_type）
const (
	ModelTypeChat       = 1 // 文字对话
	ModelTypeVision     = 2 // 视觉(图文)
	ModelTypeMultimodal = 3 // 多模态
	ModelTypeASR        = 4 // 语音识别（本服务转写功能用此类型）
)

// 通用状态枚举
const (
	StatusDisabled = 0 // 停用
	StatusEnabled  = 1 // 启用
	// t_llm_key 额外定义
	KeyStatusAutoDisabled = 2 // 连续失败自动停用
)

// API 协议
const (
	APIProtocolOpenAICompatible = "openai_compatible"
	APIProtocolCustom           = "custom"
)

// Provider 大模型提供商表 t_llm_provider（只读）
//
// 选择 provider 时使用：deleted=0 AND status=1 ORDER BY sort ASC
type Provider struct {
	ID           int64     `gorm:"column:id;primaryKey"`
	ProviderName string    `gorm:"column:provider_name"`
	ProviderCode string    `gorm:"column:provider_code"`
	BaseURL      string    `gorm:"column:base_url"`
	APIProtocol  string    `gorm:"column:api_protocol"` // openai_compatible / custom
	Status       int       `gorm:"column:status"`
	Sort         int       `gorm:"column:sort"`
	Remark       string    `gorm:"column:remark"`
	CreateTime   time.Time `gorm:"column:create_time"`
	UpdateTime   time.Time `gorm:"column:update_time"`
	Deleted      int       `gorm:"column:deleted"`
}

// TableName 指定 MySQL 表名
func (Provider) TableName() string { return "t_llm_provider" }

// Model 大模型表 t_llm_model（只读）
//
// 选择 STT 模型时使用：deleted=0 AND status=1 AND model_type=4 ORDER BY sort ASC
type Model struct {
	ID          int64     `gorm:"column:id;primaryKey"`
	ProviderID  int64     `gorm:"column:provider_id"`
	ModelCode   string    `gorm:"column:model_code"`
	ModelName   string    `gorm:"column:model_name"`
	ModelType   int       `gorm:"column:model_type"`
	MaxTokens   int       `gorm:"column:max_tokens"`
	InputPrice  float64   `gorm:"column:input_price"`
	OutputPrice float64   `gorm:"column:output_price"`
	Status      int       `gorm:"column:status"`
	Sort        int       `gorm:"column:sort"`
	Remark      string    `gorm:"column:remark"`
	CreateTime  time.Time `gorm:"column:create_time"`
	UpdateTime  time.Time `gorm:"column:update_time"`
	Deleted     int       `gorm:"column:deleted"`
}

func (Model) TableName() string { return "t_llm_model" }

// Key 大模型 Key 池表 t_llm_key（只读）
//
// 选择策略（DAO.PickKey）：
//   - WHERE deleted=0 AND status=1 AND provider_id=?
//   - AND (expire_time IS NULL OR expire_time > NOW())
//   - AND (daily_limit = 0 OR today_count < daily_limit)
//   - ORDER BY weight DESC, today_count ASC
//   - LIMIT 1
//
// 注意：本服务不写回 today_count / total_count / fail_count，
// 因为这些字段属于 LLM 网关自身的统计职责，由网关在调用时自增。
// 我们这边仅消费它们做选择权重。
type Key struct {
	ID           int64      `gorm:"column:id;primaryKey"`
	ProviderID   int64      `gorm:"column:provider_id"`
	APIKey       string     `gorm:"column:api_key"`
	KeyAlias     string     `gorm:"column:key_alias"`
	Weight       int        `gorm:"column:weight"`
	DailyLimit   int        `gorm:"column:daily_limit"`
	TodayCount   int        `gorm:"column:today_count"`
	TotalCount   int64      `gorm:"column:total_count"`
	FailCount    int        `gorm:"column:fail_count"`
	Status       int        `gorm:"column:status"` // 0/1/2
	LastUsedTime *time.Time `gorm:"column:last_used_time"`
	ExpireTime   *time.Time `gorm:"column:expire_time"`
	CreateTime   time.Time  `gorm:"column:create_time"`
	UpdateTime   time.Time  `gorm:"column:update_time"`
	Deleted      int        `gorm:"column:deleted"`
}

func (Key) TableName() string { return "t_llm_key" }
