package models

import (
	"log"

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

type ConxDb struct {
	gorm.Model
	Nombre     string   `json:"nombre" gorm:"column:nombre"`
	Host       string   `json:"host" gorm:"column:host"`      // vacío = usa Servidor.IpServidor
	Puerto     string   `json:"puerto" gorm:"column:puerto"`
	Usuario    string   `json:"usuario" gorm:"column:usuario"`
	Password   string   `json:"password" gorm:"column:password"`
	Estado     string   `json:"estado" gorm:"column:estado;default:'activo'"`
	Version    string   `json:"version" gorm:"column:version"`
	TipoDbID   uint     `json:"tipo_db_id" gorm:"column:tipo_db_id;foreignKey:TipoDbID"`
	TipoDb     TipoDb   `json:"tipo_db" gorm:"foreignKey:TipoDbID"`
	ServidorID uint     `json:"servidor_id" gorm:"column:servidor_id;foreignKey:ServidorID"`
	Servidor   Servidor `json:"servidor" gorm:"foreignKey:ServidorID"`
}

// HostEfectivo devuelve el host de conexión: el campo Host si está definido,
// o el IP del servidor asociado como fallback.
func (c ConxDb) HostEfectivo() string {
	if c.Host != "" {
		return c.Host
	}
	return c.Servidor.IpServidor
}

func (ConxDb) TableName() string {
	return "conx_db"
}

func GetAllConxDb(limit, offset int, search string) ([]ConxDb, int64, error) {
	var items []ConxDb
	var total int64
	db := app.Http.Database.DB.Model(&ConxDb{})

	if search != "" {
		db = db.Where("usuario LIKE ? OR puerto LIKE ?", "%"+search+"%", "%"+search+"%")
	}

	db = db.Preload("Servidor").Preload("TipoDb")

	if err := db.Count(&total).Error; err != nil {
		log.Printf("Error counting conx ssh: %v", err)
		return nil, 0, err
	}

	if err := db.Order("id DESC").Limit(limit).Offset(offset).Find(&items).Error; err != nil {
		log.Printf("Error retrieving conx ssh: %v", err)
		return nil, 0, err
	}

	return items, total, nil
}

func CreateConxDb(conxDb ConxDb) error {
	if err := app.Http.Database.DB.Omit("TipoDb", "Servidor").Create(&conxDb).Error; err != nil {
		return err
	}
	return nil
}

func UpdateConxDb(conxDb ConxDb) error {
	if err := app.Http.Database.DB.Model(&conxDb).Omit("TipoDb", "Servidor").Updates(map[string]interface{}{
		"nombre":      conxDb.Nombre,
		"puerto":      conxDb.Puerto,
		"usuario":     conxDb.Usuario,
		"password":    conxDb.Password,
		"estado":      conxDb.Estado,
		"version":     conxDb.Version,
		"tipo_db_id":  conxDb.TipoDbID,
		"servidor_id": conxDb.ServidorID,
	}).Error; err != nil {
		return err
	}
	return nil
}

func DeleteConxDb(conxDb ConxDb) error {
	if err := app.Http.Database.DB.Delete(&conxDb).Error; err != nil {
		return err
	}
	return nil
}

func GetConxDbSelect(servidorID string) ([]ConxDb, error) {
	var items []ConxDb
	db := app.Http.Database.DB.Model(&ConxDb{}).Select("id, nombre, servidor_id").Order("nombre ASC")
	if servidorID != "" {
		db = db.Where("servidor_id = ?", servidorID)
	}
	if err := db.Find(&items).Error; err != nil {
		return nil, err
	}
	return items, nil
}
