package infra

// CRUDResource define un recurso CRUD completo para generar handlers HTTP.
// Name es el nombre singular del recurso en snake_case (ej: "project").
// Table es el nombre de la tabla SQLite asociada (ej: "projects").
// Fields son las columnas del recurso sin contar id, created_at, updated_at y deleted_at.
// SoftDelete si es true, el handler delete hace UPDATE deleted_at en vez de DELETE real.
type CRUDResource struct {
	Name       string      // nombre del recurso (singular, snake_case)
	Table      string      // nombre de la tabla SQLite
	Fields     []CRUDField // campos del recurso (sin id ni timestamps)
	SoftDelete bool        // si true, usa deleted_at en vez de DELETE
}

// CRUDField define un campo de un recurso CRUD.
// Type debe ser uno de: TEXT, INTEGER, REAL, BLOB.
// Required fuerza NOT NULL en la tabla y validacion en create.
// Unique anade un UNIQUE constraint en la tabla.
// Default es el valor SQL por defecto (vacio = sin default).
// Validations define reglas de validacion: min_length, max_length, pattern, min, max, enum.
type CRUDField struct {
	Name        string            // nombre del campo (snake_case)
	Type        string            // tipo SQLite: TEXT, INTEGER, REAL, BLOB
	Required    bool              // NOT NULL + validacion en create
	Unique      bool              // UNIQUE constraint
	Default     string            // valor por defecto en CREATE TABLE
	Validations map[string]string // reglas: min_length, max_length, pattern, min, max, enum
}

// CRUDListParams agrupa los parametros de paginacion, orden y filtro del endpoint list.
// Page es 1-based (default 1). PerPage tiene default 20 y max 100.
// SortBy es el nombre del campo por el que ordenar. SortDir es "asc" o "desc".
// Filters contiene pares campo -> valor para filtros exactos en WHERE.
type CRUDListParams struct {
	Page    int               // pagina actual (1-based, default 1)
	PerPage int               // items por pagina (default 20, max 100)
	SortBy  string            // campo por el que ordenar
	SortDir string            // "asc" o "desc"
	Filters map[string]string // campo -> valor para WHERE exacto
}

// CRUDListResult resultado paginado de una lista CRUD, serializable a JSON.
type CRUDListResult struct {
	Items      []map[string]any `json:"items"`
	Total      int              `json:"total"`
	Page       int              `json:"page"`
	PerPage    int              `json:"per_page"`
	TotalPages int              `json:"total_pages"`
}
