-- =============================================================================
-- Migración:    0001_create_tenants_table
-- Sprint:       1.2 — multi-tenancy core
-- Tabla:        tenants
-- Aplica en:    BD maestra (innovium_master)
-- Dependencias: ninguna (es la primera migración del schema de master).
--
-- Descripción:
--   Catálogo de funerarias clientes de Innovium. Una fila por tenant.
--   El TenantResolver consulta esta tabla en cada request para mapear
--   subdominio → BD del tenant.
--
-- Notas de diseño:
--   - slug: identificador URL del tenant ("demo", "infinia"). Validado en
--     PHP con regex /^[a-z][a-z0-9-]{2,30}$/ ANTES de tocar BD. Más una
--     lista de reservados (admin, api, www, master, etc.). UNIQUE en BD
--     como segunda barrera.
--   - db_name / storage_path: aislamiento físico. Cada tenant tiene su
--     propia BD MySQL y su propio prefijo en R2. Ambos UNIQUE para impedir
--     colisiones por bug de operación.
--   - dominio_personalizado: opcional. Si en el futuro un tenant quiere
--     usar "sistema.funerariainfinia.cl", se setea acá. UNIQUE permite
--     múltiples NULL (default InnoDB).
--   - estado: ENUM cerrado. El TenantResolver solo permite request si
--     estado IN ('activo', 'en_trial'). 'suspendido' devuelve 503;
--     'eliminado' o eliminado_en NOT NULL devuelven 404 genérico (no
--     revelar diferencia para no filtrar info al atacante).
--   - branding_color_primario / branding_logo_url: nullable. Si NULL,
--     la UI usa los defaults de Innovium. Branding custom funcional
--     real es Sprint 1.4.
--   - eliminado_en: soft delete. NUNCA hacer DELETE físico — los hijos
--     tienen FKs RESTRICT y romperíamos integridad histórica.
-- =============================================================================

CREATE TABLE tenants (
    id                       BIGINT UNSIGNED NOT NULL AUTO_INCREMENT
                             COMMENT 'PK auto-incremental del tenant.',
    slug                     VARCHAR(50)     NOT NULL
                             COMMENT 'Identificador URL del tenant (ej: "demo", "infinia"). Validado en PHP con regex.',
    nombre                   VARCHAR(150)    NOT NULL
                             COMMENT 'Nombre legal completo (ej: "Funeraria Infinia SpA").',
    nombre_corto             VARCHAR(80)     NOT NULL
                             COMMENT 'Nombre comercial corto para UI (ej: "Infinia").',
    db_name                  VARCHAR(80)     NOT NULL
                             COMMENT 'Nombre exacto de la BD MySQL del tenant (ej: "innovium_infinia").',
    storage_path             VARCHAR(120)    NOT NULL
                             COMMENT 'Prefijo de path en Cloudflare R2 (ej: "tenants/infinia").',
    dominio_personalizado    VARCHAR(200)        NULL
                             COMMENT 'Dominio custom opcional (ej: "sistema.funerariainfinia.cl"). NULL = solo subdominio.',
    estado                   ENUM('activo', 'suspendido', 'eliminado', 'en_trial')
                             NOT NULL DEFAULT 'activo'
                             COMMENT 'Estado operacional del tenant. activo/en_trial = puede operar; suspendido = 503; eliminado = 404 genérico.',
    plan_tipo                VARCHAR(50)         NULL
                             COMMENT 'Placeholder para Sprint 2.x billing (ej: "essential", "pro", "enterprise").',
    branding_color_primario  VARCHAR(7)          NULL
                             COMMENT 'Color hex custom (ej: "#7C3AED"). NULL = usa default Innovium.',
    branding_logo_url        VARCHAR(500)        NULL
                             COMMENT 'URL en R2 al logo de la funeraria. NULL = usa default Innovium.',
    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. Auto-actualizado por MySQL.',
    eliminado_en             DATETIME            NULL
                             COMMENT 'UTC del soft-delete. NULL = activo. NUNCA hacer DELETE físico.',
    PRIMARY KEY (id),
    UNIQUE KEY uq_tenants_slug (slug),
    UNIQUE KEY uq_tenants_db_name (db_name),
    UNIQUE KEY uq_tenants_storage_path (storage_path),
    UNIQUE KEY uq_tenants_dominio_personalizado (dominio_personalizado),
    KEY idx_tenants_estado (estado),
    KEY idx_tenants_eliminado_en (eliminado_en)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  COMMENT='Catálogo de funerarias clientes. Resuelto por subdominio en cada request.';
