package models

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

// PlantillaDocumento es la fuente de verdad de las plantillas base usadas por
// la automatización con IA: cotización, contrato, acta de proyecto y cuenta de cobro.
// Editar una plantilla aquí actualiza automáticamente todos los canales (Telegram,
// chat propio, Claude directo) que generan ese tipo de documento.
type PlantillaDocumento struct {
	gorm.Model
	Tipo          string `json:"tipo" gorm:"column:tipo;size:30;not null;index"` // cotizacion | contrato | acta | cuenta_cobro
	Nombre        string `json:"nombre" gorm:"column:nombre;size:150;not null"`
	ContenidoHTML string `json:"contenido_html" gorm:"column:contenido_html;type:text"` // Go text/template
	Version       int    `json:"version" gorm:"column:version;default:1"`
	Activa        bool   `json:"activa" gorm:"column:activa;default:true"`
	Notas         string `json:"notas" gorm:"column:notas;type:text"`
}

func (PlantillaDocumento) TableName() string { return "plantillas_documento" }

func GetAllPlantillasDocumento(limit, offset int, search, tipo string) ([]PlantillaDocumento, int64, error) {
	var items []PlantillaDocumento
	var total int64
	db := app.Http.Database.DB.Model(&PlantillaDocumento{})
	if search != "" {
		db = db.Where("nombre ILIKE ?", "%"+search+"%")
	}
	if tipo != "" {
		db = db.Where("tipo = ?", tipo)
	}
	if err := db.Count(&total).Error; err != nil {
		return nil, 0, err
	}
	if err := db.Order("tipo ASC, version DESC").Limit(limit).Offset(offset).Find(&items).Error; err != nil {
		return nil, 0, err
	}
	return items, total, nil
}

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

// GetPlantillaDocumentoActiva retorna la plantilla activa más reciente para un tipo dado.
// Es la que usan los endpoints de generación (cotizaciones, contratos, etc).
func GetPlantillaDocumentoActiva(tipo string) (*PlantillaDocumento, error) {
	var item PlantillaDocumento
	if err := app.Http.Database.DB.
		Where("tipo = ? AND activa = ?", tipo, true).
		Order("version DESC").
		First(&item).Error; err != nil {
		return nil, err
	}
	return &item, nil
}

func CreatePlantillaDocumento(p PlantillaDocumento) error {
	return app.Http.Database.DB.Create(&p).Error
}

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

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