package models

import (
	"log"

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

type ProvServidor struct {
	gorm.Model
	Nombre        string       `json:"nombre" gorm:"column:nombre"`
	Integraciones []Submodules `json:"integraciones" gorm:"many2many:prov_servidor_submodules;"`
}

func (ProvServidor) TableName() string {
	return "prov_servidor"
}

func GetAllProvServidor(search string) ([]ProvServidor, int64, error) {
	var items []ProvServidor
	var total int64
	db := app.Http.Database.DB.Model(&ProvServidor{})

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

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

	if err := db.Preload("Integraciones").Order("created_at DESC").Find(&items).Error; err != nil {
		log.Printf("Error retrieving proveedores: %v", err)
		return nil, 0, err
	}

	return items, total, nil
}

func CreateProvServidor(provServidor ProvServidor) error {
	if err := app.Http.Database.DB.Create(&provServidor).Error; err != nil {
		return err
	}
	return nil
}

func UpdateProvServidor(provServidor ProvServidor) error {
	if err := app.Http.Database.DB.Model(&provServidor).Updates(provServidor).Error; err != nil {
		return err
	}
	return nil
}

func DeleteProvServidor(provServidor ProvServidor) error {
	if err := app.Http.Database.DB.Delete(&provServidor).Error; err != nil {
		return err
	}
	return nil
}

// SetIntegraciones reemplaza todas las integraciones del proveedor con los IDs dados.
func SetProvServidorIntegraciones(provServidorID uint, submoduleIDs []uint) error {
	db := app.Http.Database.DB
	var prov ProvServidor
	if err := db.First(&prov, provServidorID).Error; err != nil {
		return err
	}
	var subs []Submodules
	if len(submoduleIDs) > 0 {
		if err := db.Where("id IN ?", submoduleIDs).Find(&subs).Error; err != nil {
			return err
		}
	}
	return db.Model(&prov).Association("Integraciones").Replace(subs)
}
