package models

import (
	"log"

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

type Servicio struct {
	gorm.Model
	Nombre       string  `json:"nombre" gorm:"column:nombre"`
	Descripcion  string  `json:"descripcion" gorm:"column:descripcion"`
	Precio       float64 `json:"precio" gorm:"column:precio"`
	Moneda       string  `json:"moneda" gorm:"column:moneda;default:'COP'"`
	Tipo         string  `json:"tipo" gorm:"column:tipo;default:'renovable'"` // renovable | unico
	Periodicidad string  `json:"periodicidad" gorm:"column:periodicidad"`     // mensual | trimestral | semestral | anual
	Activo       bool    `json:"activo" gorm:"column:activo;default:true"`
}

func (Servicio) TableName() string { return "servicios" }

func GetAllServicios(limit, offset int, search string) ([]Servicio, int64, error) {
	var items []Servicio
	var total int64
	db := app.Http.Database.DB.Model(&Servicio{})
	if search != "" {
		db = db.Where("nombre ILIKE ? OR descripcion ILIKE ?", "%"+search+"%", "%"+search+"%")
	}
	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 GetAllServiciosSelect() ([]Servicio, error) {
	var items []Servicio
	if err := app.Http.Database.DB.Where("activo = ?", true).Order("nombre ASC").Find(&items).Error; err != nil {
		return nil, err
	}
	return items, nil
}

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

func CreateServicio(s Servicio) error {
	return app.Http.Database.DB.Create(&s).Error
}

func UpdateServicio(s Servicio) error {
	return app.Http.Database.DB.Model(&Servicio{}).Where("id = ?", s.ID).Updates(map[string]interface{}{
		"nombre":       s.Nombre,
		"descripcion":  s.Descripcion,
		"precio":       s.Precio,
		"moneda":       s.Moneda,
		"tipo":         s.Tipo,
		"periodicidad": s.Periodicidad,
		"activo":       s.Activo,
	}).Error
}

func DeleteServicio(id uint) error {
	var s Servicio
	if err := app.Http.Database.DB.First(&s, id).Error; err != nil {
		return err
	}
	if err := app.Http.Database.DB.Delete(&s).Error; err != nil {
		log.Printf("Error deleting servicio: %v", err)
		return err
	}
	return nil
}
