package models

import (
	"github.com/sujit-baniya/fiber-boilerplate/app"
	"gorm.io/gorm"
)

// UmindAgente es un agente de IA independiente dentro de un tenant — un
// mismo negocio puede tener varios (ej. "Ventas", "Soporte"), cada uno con
// su propia base de conocimiento, tools, canales y conexión de correo. Lo
// único que sigue siendo del tenant (no del agente) son los dominios
// permitidos y el nombre del negocio que se muestra al visitante — eso es
// del sitio, no de un agente puntual.
type UmindAgente struct {
	gorm.Model
	TenantID          uint   `json:"tenant_id" gorm:"column:tenant_id;index;not null"`
	Nombre            string `json:"nombre" gorm:"column:nombre;size:150;not null"` // etiqueta interna, ej: "Ventas"
	SiteKey           string `json:"site_key" gorm:"column:site_key;uniqueIndex;size:40;not null"`
	AiConfigID        *uint  `json:"ai_config_id" gorm:"column:ai_config_id"`
	Tono              string `json:"tono" gorm:"column:tono;type:text"`
	MensajeBienvenida string `json:"mensaje_bienvenida" gorm:"column:mensaje_bienvenida;type:text"`
	Color             string `json:"color" gorm:"column:color;size:7;default:'#8eb02f'"`
	Activo            bool   `json:"activo" gorm:"column:activo;default:true"`
}

func (UmindAgente) TableName() string { return "umind_agentes" }

func CreateUmindAgente(a *UmindAgente) error {
	if a.SiteKey == "" {
		key, err := GenerarSiteKey()
		if err != nil {
			return err
		}
		a.SiteKey = key
	}
	if a.Color == "" {
		a.Color = "#8eb02f"
	}
	return app.Http.Database.DB.Create(a).Error
}

func GetUmindAgentesByTenant(tenantID uint) ([]UmindAgente, error) {
	var items []UmindAgente
	err := app.Http.Database.DB.Where("tenant_id = ?", tenantID).Order("id ASC").Find(&items).Error
	return items, err
}

func GetUmindAgenteByID(id uint) (*UmindAgente, error) {
	var a UmindAgente
	if err := app.Http.Database.DB.First(&a, id).Error; err != nil {
		return nil, err
	}
	return &a, nil
}

// GetUmindAgenteBySiteKey resuelve el agente a partir de la site_key pública
// que manda el widget. Solo hace match si el agente está activo.
func GetUmindAgenteBySiteKey(siteKey string) (*UmindAgente, error) {
	var a UmindAgente
	if err := app.Http.Database.DB.Where("site_key = ? AND activo = ?", siteKey, true).First(&a).Error; err != nil {
		return nil, err
	}
	return &a, nil
}

func UpdateUmindAgente(id uint, updates map[string]interface{}) error {
	return app.Http.Database.DB.Model(&UmindAgente{}).Where("id = ?", id).Updates(updates).Error
}

func DeleteUmindAgente(id uint) error {
	return app.Http.Database.DB.Delete(&UmindAgente{}, id).Error
}
