package models

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

// DocCategoria es una categoría GLOBAL que puede aplicarse a la documentación de cualquier SaaS.
// Ejemplos: "Primeros Pasos", "API Reference", "Configuración", "Facturación".
type DocCategoria struct {
	gorm.Model
	Nombre      string `json:"nombre"       gorm:"column:nombre;not null"`
	Slug        string `json:"slug"         gorm:"column:slug;uniqueIndex;not null"`
	Descripcion string `json:"descripcion"  gorm:"column:descripcion;type:text"`
	Orden       int    `json:"orden"        gorm:"column:orden;default:0"`
}

func (DocCategoria) TableName() string { return "doc_categorias" }

func GetAllDocCategorias(limit, offset int, search string) ([]DocCategoria, int64, error) {
	var items []DocCategoria
	var total int64
	db := app.Http.Database.DB.Model(&DocCategoria{})
	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("orden ASC, nombre ASC").Limit(limit).Offset(offset).Find(&items).Error; err != nil {
		return nil, 0, err
	}
	return items, total, nil
}

func GetAllDocCategoriasSelect() ([]DocCategoria, error) {
	var items []DocCategoria
	if err := app.Http.Database.DB.Order("orden ASC, nombre ASC").Find(&items).Error; err != nil {
		return nil, err
	}
	return items, nil
}

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

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

func UpdateDocCategoria(c *DocCategoria) error {
	return app.Http.Database.DB.Model(&DocCategoria{}).Where("id = ?", c.ID).Updates(map[string]interface{}{
		"nombre":      c.Nombre,
		"slug":        c.Slug,
		"descripcion": c.Descripcion,
		"orden":       c.Orden,
	}).Error
}

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