package models

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

// DocumentoGenerado es el historial de documentos producidos por el motor de
// automatización con IA (cotización, contrato, acta/arquitectura, cuenta de cobro),
// sin importar el canal que los originó (Telegram, chat propio o Claude directo).
type DocumentoGenerado struct {
	gorm.Model
	Tipo        string   `json:"tipo" gorm:"column:tipo;size:30;not null;index"` // cotizacion | contrato | acta | cuenta_cobro
	ClienteID   *uint    `json:"cliente_id" gorm:"column:cliente_id;index"`
	Cliente     *Cliente `json:"cliente,omitempty" gorm:"foreignKey:ClienteID"`
	ProyectoID  *uint    `json:"proyecto_id" gorm:"column:proyecto_id;index"`
	PlantillaID *uint    `json:"plantilla_id" gorm:"column:plantilla_id"`
	Nombre      string   `json:"nombre" gorm:"column:nombre;size:200"`
	Archivo     string   `json:"archivo" gorm:"column:archivo"` // ruta en disco, ej: uploads/documentos/cotizacion/12/xyz.pdf
	TipoMime    string   `json:"tipo_mime" gorm:"column:tipo_mime;default:'application/pdf'"`
	Tamanio     int64    `json:"tamanio" gorm:"column:tamanio"`
	DatosJSON   string   `json:"datos_json" gorm:"column:datos_json;type:text"`                 // input usado para generarlo (auditoría)
	GeneradoPor string   `json:"generado_por" gorm:"column:generado_por;size:20;default:'web'"` // web | telegram | claude_api
}

func (DocumentoGenerado) TableName() string { return "documentos_generados" }

func CreateDocumentoGenerado(d *DocumentoGenerado) error {
	return app.Http.Database.DB.Create(d).Error
}

func GetAllDocumentosGenerados(limit, offset int, tipo string, clienteID uint) ([]DocumentoGenerado, int64, error) {
	var items []DocumentoGenerado
	var total int64
	db := app.Http.Database.DB.Model(&DocumentoGenerado{}).Preload("Cliente")
	if tipo != "" {
		db = db.Where("tipo = ?", tipo)
	}
	if clienteID != 0 {
		db = db.Where("cliente_id = ?", clienteID)
	}
	if err := db.Count(&total).Error; err != nil {
		return nil, 0, err
	}
	if err := db.Order("id DESC").Limit(limit).Offset(offset).Find(&items).Error; err != nil {
		return nil, 0, err
	}
	return items, total, nil
}

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