package models

import (
	"log"

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

// UmindEventoLog es el registro de auditoría técnica de un agente — errores
// y eventos que hoy solo quedaban en el log del servidor (invisibles desde
// el panel): fallos al llamar al AI, tools/webhooks que fallan, canales que
// no logran procesar un mensaje, etc. No es el historial de conversación
// (eso es UmindMensaje) ni el estado de ingesta (eso ya se ve por
// documento en UmindDocumento.Estado/Error) — es específicamente lo que
// antes solo se podía ver pidiendo los logs del servidor.
type UmindEventoLog struct {
	gorm.Model
	AgenteID uint   `json:"agente_id" gorm:"column:agente_id;index"`
	Nivel    string `json:"nivel" gorm:"column:nivel;size:10"`   // error | warn
	Origen   string `json:"origen" gorm:"column:origen;size:40"` // ai | tool | email | canal_telegram | canal_whatsapp
	Mensaje  string `json:"mensaje" gorm:"column:mensaje;type:text"`
	Detalle  string `json:"detalle" gorm:"column:detalle;type:text"` // JSON crudo opcional, para diagnosticar sin pedir logs
}

func (UmindEventoLog) TableName() string { return "umind_eventos_log" }

// RegistrarEventoUmind guarda un evento de auditoría. No devuelve error a
// propósito — es un side-channel de diagnóstico, nunca debe interrumpir el
// flujo principal (responderle al visitante) si la escritura falla.
func RegistrarEventoUmind(agenteID uint, nivel, origen, mensaje, detalle string) {
	e := &UmindEventoLog{AgenteID: agenteID, Nivel: nivel, Origen: origen, Mensaje: mensaje, Detalle: detalle}
	if err := app.Http.Database.DB.Create(e).Error; err != nil {
		log.Printf("[UMIND] No se pudo guardar el evento de auditoría (agente %d): %v", agenteID, err)
	}
}

// GetUmindEventosByAgente retorna los últimos eventos del agente, más
// reciente primero — acotado para no crecer sin límite en la respuesta.
func GetUmindEventosByAgente(agenteID uint, limit int) ([]UmindEventoLog, error) {
	if limit <= 0 || limit > 200 {
		limit = 100
	}
	var items []UmindEventoLog
	err := app.Http.Database.DB.
		Where("agente_id = ?", agenteID).
		Order("id DESC").
		Limit(limit).
		Find(&items).Error
	return items, err
}
