-- =============================================================================
-- Migración:    0016_create_tenant_config_table
-- Sprint:       1.3 — schema del catálogo
-- Tabla:        tenant_config
-- Aplica en:    BD de cada tenant (innovium_<slug>)
-- Dependencias: 0001 (users).
--
-- Descripción:
--   Settings clave-valor del tenant. Permite ajustar parámetros
--   operativos sin tocar código ni migrar schema.
--
--   Settings sembrados inicialmente (Sprint 1.3 mínimo):
--     · valor_uf_actual = "38500"  (decimal, monetario)
--     · iva_porcentaje  = "19"     (decimal, monetario)
--     · moneda_default  = "CLP"    (string,  monetario)
--
--   Próximos sprints van a agregar más sin requerir migración:
--     dias_pago_default, plazo_garantia_anos, color_brand_secundario,
--     telefono_contacto, etc.
--
-- Notas de diseño:
--
--   · valor TEXT siempre. La columna `tipo` indica cómo parsearlo:
--       string  → tal cual
--       int     → (int) $valor
--       decimal → (float) $valor
--       boolean → $valor === '1'
--       json    → json_decode($valor, true)
--       date    → new DateTimeImmutable($valor)
--     El casting lo hace TenantConfig::get() en código (Sprint 1.3).
--
--   · clave UNIQUE: identificador estable por tenant. Convención snake_case.
--
--   · categoria: agrupa settings en la UI futura (monetario, legal,
--     operativo, branding). Sin FK ni ENUM porque las categorías
--     pueden crecer y un VARCHAR es más liviano.
--
--   · editable_por_admin: algunos settings son críticos y solo
--     Crono Systems debe modificarlos (ej: feature_flags_activos,
--     billing_*). UI Sprint 1.4 va a respetar este flag.
--
--   · actualizado_por FK a users.id ON DELETE SET NULL: trazabilidad
--     de quién cambió cada setting. SET NULL preserva el histórico si
--     el user se borra físicamente.
--
--   · TenantConfig::set() ESCRIBE audit_log (excepción al "models
--     silenciosos") porque cambiar valor_uf_actual o iva_porcentaje
--     es una decisión configurativa con impacto financiero. El audit
--     guarda la CLAVE, no el valor (futuras configs pueden ser
--     sensibles: tokens, credenciales).
-- =============================================================================

CREATE TABLE tenant_config (
    id                  BIGINT UNSIGNED NOT NULL AUTO_INCREMENT
                        COMMENT 'PK auto-incremental.',
    clave               VARCHAR(100)    NOT NULL
                        COMMENT 'Identificador snake_case único (ej: "valor_uf_actual"). UNIQUE.',
    valor               TEXT            NOT NULL
                        COMMENT 'Valor serializado como string. TenantConfig::get() lo parsea según `tipo`.',
    tipo                ENUM('string', 'int', 'decimal', 'boolean', 'json', 'date')
                        NOT NULL DEFAULT 'string'
                        COMMENT 'Indica cómo parsear `valor` al leerlo. Ver TenantConfig::get().',
    categoria           VARCHAR(50)     NOT NULL DEFAULT 'general'
                        COMMENT 'Agrupación para UI: monetario, legal, operativo, branding, general.',
    descripcion         TEXT                NULL
                        COMMENT 'Qué hace este setting. Mostrado en UI Sprint 1.4.',
    editable_por_admin  TINYINT(1)      NOT NULL DEFAULT 1
                        COMMENT '1=admin tenant puede editarlo, 0=solo Crono Systems.',
    actualizado_por     BIGINT UNSIGNED     NULL
                        COMMENT 'FK → users.id (SET NULL). NULL si fue seed inicial o user borrado.',
    creado_en           DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP
                        COMMENT 'UTC de creación. Inmutable.',
    actualizado_en      DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP
                                                 ON UPDATE CURRENT_TIMESTAMP
                        COMMENT 'UTC de la última edición.',
    PRIMARY KEY (id),
    UNIQUE KEY uq_tenant_config_clave (clave),
    KEY idx_tenant_config_categoria (categoria),
    KEY idx_tenant_config_actualizado_por (actualizado_por),
    CONSTRAINT fk_tenant_config_actualizado_por
        FOREIGN KEY (actualizado_por) REFERENCES users (id)
        ON DELETE SET NULL ON UPDATE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  COMMENT='Settings clave-valor del tenant. Casting según `tipo`. set() escribe audit_log.';
