-- =============================================================================
-- Migración:    0005_create_tenant_audit_log_table
-- Sprint:       1.2 — multi-tenancy core
-- Tabla:        tenant_audit_log
-- Aplica en:    BD maestra (innovium_master)
-- Dependencias: 0001 (tenants).
--
-- Descripción:
--   Registro INMUTABLE de operaciones cross-tenant que solo Crono Systems
--   ejecuta: crear tenant, suspender, cambiar plan, etc.
--
--   Distinto del audit_log que cada tenant tiene en su propia BD
--   (innovium_<slug>.audit_log) — ese registra acciones internas del
--   tenant (login, contratos, pagos). Este registra acciones de Crono
--   sobre el catálogo de tenants.
--
--   En Sprint 1.2 se inserta acá desde el comando tenant:create con
--   acción "tenant.creado".
--
-- Notas de diseño:
--   - tenant_id NULLABLE: hay acciones globales sin tenant específico
--     (ej: futuras operaciones bulk, mantenimiento, exports cross-tenant).
--   - ON DELETE SET NULL en tenant_id: si en algún momento se hace
--     DELETE físico de un tenant (caso extremo, post-soft-delete y
--     limpieza), preservamos el log histórico aunque pierda el FK.
--     Es la única tabla del schema master con SET NULL — porque acá la
--     trazabilidad histórica vale más que la integridad referencial.
--   - accion: verbo dotted, mismo estilo que audit_log de tenant.
--     Convención: "tenant.<verbo>" (ej: tenant.creado, tenant.suspendido,
--     tenant.plan_cambiado).
--   - detalle JSON: metadata variable según la acción (ej: para
--     tenant.plan_cambiado guardamos {"plan_anterior": "essential",
--     "plan_nuevo": "pro"}).
--   - Sin actualizado_en: append-only por convención. Solo INSERTs.
--   - Sin user_id por ahora: en Sprint 2.x cuando exista el panel
--     superadmin con login propio, se agregará una columna superadmin_id
--     que referencie a otra tabla de master. En 1.2 las acciones vienen
--     del CLI como root.
-- =============================================================================

CREATE TABLE tenant_audit_log (
    id          BIGINT UNSIGNED NOT NULL AUTO_INCREMENT
                COMMENT 'PK auto-incremental.',
    tenant_id   BIGINT UNSIGNED     NULL
                COMMENT 'FK → tenants.id (SET NULL). NULL si la acción es global o el tenant fue borrado físicamente.',
    accion      VARCHAR(100)    NOT NULL
                COMMENT 'Verbo dotted (ej: "tenant.creado", "tenant.suspendido").',
    detalle     JSON                NULL
                COMMENT 'Metadata específica de la acción en formato JSON. NULL si no aplica.',
    ip          VARCHAR(45)     NOT NULL
                COMMENT 'IPv4 o IPv6 desde donde se ejecutó la acción. "cli" si viene de scripts/innovium.',
    creado_en   DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP
                COMMENT 'UTC del evento. Inmutable.',
    PRIMARY KEY (id),
    KEY idx_tenant_audit_log_tenant_creado (tenant_id, creado_en),
    KEY idx_tenant_audit_log_accion_creado (accion, creado_en),
    CONSTRAINT fk_tenant_audit_log_tenant
        FOREIGN KEY (tenant_id) REFERENCES tenants (id)
        ON DELETE SET NULL ON UPDATE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  COMMENT='Log inmutable de operaciones cross-tenant de Crono Systems. Append-only.';
