package models

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

// Arquitectura guarda patrones de arquitectura técnica ya resueltos (ej: Active
// Directory redundante en Azure con VPN Gateway) para que la IA los reutilice como
// referencia al generar una propuesta técnica nueva, en vez de improvisar cada vez.
type Arquitectura struct {
	gorm.Model
	Nombre        string `json:"nombre" gorm:"column:nombre;size:150;not null"`
	Descripcion   string `json:"descripcion" gorm:"column:descripcion;type:text"`
	ContenidoHTML string `json:"contenido_html" gorm:"column:contenido_html;type:text"`  // diagrama/detalle en HTML, reutilizable como referencia
	Tags          string `json:"tags" gorm:"column:tags;size:255"`                       // comma-separated, ej: "azure,ad,vpn"
	EsReferencia  bool   `json:"es_referencia" gorm:"column:es_referencia;default:true"` // true = patrón reutilizable, false = propuesta generada puntual
	ClienteID     *uint  `json:"cliente_id" gorm:"column:cliente_id;index"`
}

func (Arquitectura) TableName() string { return "arquitecturas" }

func GetAllArquitecturas(limit, offset int, search string, soloReferencias bool) ([]Arquitectura, int64, error) {
	var items []Arquitectura
	var total int64
	db := app.Http.Database.DB.Model(&Arquitectura{})
	if search != "" {
		db = db.Where("nombre ILIKE ? OR tags ILIKE ?", "%"+search+"%", "%"+search+"%")
	}
	if soloReferencias {
		db = db.Where("es_referencia = ?", true)
	}
	if err := db.Count(&total).Error; err != nil {
		return nil, 0, err
	}
	if err := db.Order("nombre ASC").Limit(limit).Offset(offset).Find(&items).Error; err != nil {
		return nil, 0, err
	}
	return items, total, nil
}

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

func CreateArquitectura(a *Arquitectura) error {
	return app.Http.Database.DB.Create(a).Error
}

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

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