package models

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

// TelegramConfig almacena un bot configurado con su chat_id de destino.
type TelegramConfig struct {
	gorm.Model
	Nombre   string `json:"nombre"    gorm:"column:nombre;not null"`
	BotToken string `json:"bot_token" gorm:"column:bot_token;type:text;not null"`
	ChatID   string `json:"chat_id"   gorm:"column:chat_id;not null"` // puede ser número o @canal
	Activo   bool   `json:"activo"    gorm:"column:activo;default:true"`
	Notas    string `json:"notas"     gorm:"column:notas;type:text"`
}

func (TelegramConfig) TableName() string { return "telegram_configs" }

// TelegramLog registra cada mensaje enviado.
type TelegramLog struct {
	gorm.Model
	TelegramConfigID uint           `json:"telegram_config_id" gorm:"column:telegram_config_id;index"`
	TelegramConfig   TelegramConfig `json:"telegram_config"    gorm:"foreignKey:TelegramConfigID"`
	Titulo           string         `json:"titulo"             gorm:"column:titulo"`
	Mensaje          string         `json:"mensaje"            gorm:"column:mensaje;type:text"`
	Estado           string         `json:"estado"             gorm:"column:estado"` // ok | failed
	ErrorMsg         string         `json:"error_msg"          gorm:"column:error_msg;type:text"`
}

func (TelegramLog) TableName() string { return "telegram_logs" }

// ─── Queries ──────────────────────────────────────────────────────────────────

func GetAllTelegramConfigs() ([]TelegramConfig, error) {
	var items []TelegramConfig
	err := app.Http.Database.DB.Order("created_at DESC").Find(&items).Error
	return items, err
}

func GetTelegramConfigByID(id uint) (*TelegramConfig, error) {
	var item TelegramConfig
	err := app.Http.Database.DB.First(&item, id).Error
	return &item, err
}

func CreateTelegramConfig(c *TelegramConfig) error {
	return app.Http.Database.DB.Create(c).Error
}

func UpdateTelegramConfig(c *TelegramConfig) error {
	return app.Http.Database.DB.Model(&TelegramConfig{}).Where("id = ?", c.ID).Updates(map[string]interface{}{
		"nombre":    c.Nombre,
		"bot_token": c.BotToken,
		"chat_id":   c.ChatID,
		"activo":    c.Activo,
		"notas":     c.Notas,
	}).Error
}

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

func GetTelegramLogs(limit, offset int) ([]TelegramLog, int64, error) {
	var items []TelegramLog
	var total int64
	db := app.Http.Database.DB.Model(&TelegramLog{}).Preload("TelegramConfig")
	if err := db.Count(&total).Error; err != nil {
		return nil, 0, err
	}
	if err := db.Order("created_at DESC").Limit(limit).Offset(offset).Find(&items).Error; err != nil {
		return nil, 0, err
	}
	return items, total, nil
}

func CreateTelegramLog(l *TelegramLog) error {
	return app.Http.Database.DB.Create(l).Error
}
