package models

import (
	"time"

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

// UmindConexion es una cuenta de correo real (Gmail u Outlook) conectada por
// OAuth a un agente, para que pueda enviar y leer correo en su nombre (tools
// enviar_correo/leer_bandeja, ver pkg/services/umind_agent_service.go).
// AccessTokenEnc/RefreshTokenEnc viajan cifrados en reposo (ver
// pkg/services/umind_secrets.go) — a diferencia del site_key del widget,
// estos SÍ son secretos: quien los tenga puede leer/mandar correo como el
// dueño de la cuenta.
type UmindConexion struct {
	gorm.Model
	AgenteID        uint      `json:"agente_id" gorm:"column:agente_id;index"`
	Proveedor       string    `json:"proveedor" gorm:"column:proveedor;size:20;not null"` // google | microsoft
	Email           string    `json:"email" gorm:"column:email;size:255"`
	AccessTokenEnc  string    `json:"-" gorm:"column:access_token_enc;type:text"`
	RefreshTokenEnc string    `json:"-" gorm:"column:refresh_token_enc;type:text"`
	ExpiraEn        time.Time `json:"expira_en" gorm:"column:expira_en"`
	Scopes          string    `json:"scopes" gorm:"column:scopes;type:text"`
	Activo          bool      `json:"activo" gorm:"column:activo;default:true"`
}

func (UmindConexion) TableName() string { return "umind_conexiones" }

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

func GetUmindConexionesByAgente(agenteID uint) ([]UmindConexion, error) {
	var items []UmindConexion
	err := app.Http.Database.DB.Where("agente_id = ?", agenteID).Order("id DESC").Find(&items).Error
	return items, err
}

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

// GetUmindConexionActiva retorna la primera conexión activa del agente —
// hoy se soporta una sola cuenta de correo conectada por agente, no una
// bandeja por proveedor a la vez.
func GetUmindConexionActiva(agenteID uint) (*UmindConexion, error) {
	var c UmindConexion
	err := app.Http.Database.DB.Where("agente_id = ? AND activo = ?", agenteID, true).First(&c).Error
	if err != nil {
		return nil, err
	}
	return &c, nil
}

// DesactivarConexionesDelAgente se llama antes de crear una conexión nueva —
// hoy se soporta una sola cuenta de correo activa por agente a la vez.
func DesactivarConexionesDelAgente(agenteID uint) error {
	return app.Http.Database.DB.Model(&UmindConexion{}).
		Where("agente_id = ? AND activo = ?", agenteID, true).
		Update("activo", false).Error
}

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

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