-- =============================================================================
-- Migración:    0004_create_tenant_admin_users_table
-- Sprint:       1.2 — multi-tenancy core (estructura) + 2.x (uso real)
-- Tabla:        tenant_admin_users
-- Aplica en:    BD maestra (innovium_master)
-- Dependencias: 0001 (tenants).
--
-- Descripción:
--   Resuelve el problema "huevo y gallina" para crear usuarios en un
--   tenant nuevo: para tener un usuario en innovium_<slug>.users hay que
--   estar logueado, pero un tenant recién creado no tiene nadie.
--
--   Flujo target (Sprint 2.x):
--     1. Crono crea tenant "infinia" → INSERT en tenant_admin_users.
--     2. Admin recibe email de bienvenida con link único.
--     3. Admin define password en pantalla pública.
--     4. Sistema migra al admin a innovium_infinia.users con rol
--        tenant_admin y marca migrado_a_tenant=1.
--     5. Logins futuros van directo a innovium_infinia.users.
--
--   En Sprint 1.2 simplificamos: tenant:create siembra el admin
--   directo en innovium_<slug>.users (con password aleatoria impresa
--   en consola) y NO usa esta tabla. La tabla se crea para que el
--   schema esté listo cuando llegue el flujo real.
--
-- Notas de diseño:
--   - password_hash NULLABLE: en el flujo target el admin recibe el
--     email primero (sin password) y la setea él mismo. Hasta que la
--     setea, password_hash queda NULL → no puede loguearse.
--   - email_verificado_en: NULL hasta que el admin clickea el link
--     del email. Sprint 2.x bloqueará login si NULL.
--   - migrado_a_tenant: una vez que el admin ya existe en users del
--     tenant, este flag se setea a 1 y la fila acá queda como histórico.
--   - UNIQUE(tenant_id, email): un email no puede ser admin inicial
--     dos veces del mismo tenant. Pero el mismo email PUEDE ser admin
--     inicial de tenants distintos (son personas distintas para Innovium).
--   - ON DELETE RESTRICT en tenant_id: ver nota en 0002.
-- =============================================================================

CREATE TABLE tenant_admin_users (
    id                    BIGINT UNSIGNED NOT NULL AUTO_INCREMENT
                          COMMENT 'PK auto-incremental.',
    tenant_id             BIGINT UNSIGNED NOT NULL
                          COMMENT 'FK → tenants.id (RESTRICT).',
    email                 VARCHAR(180)    NOT NULL
                          COMMENT 'Email del admin inicial. UNIQUE por tenant.',
    nombre                VARCHAR(150)    NOT NULL
                          COMMENT 'Nombre completo legible del admin.',
    password_hash         VARCHAR(255)        NULL
                          COMMENT 'Hash Argon2id. NULL = el admin todavía no definió su password vía email.',
    email_verificado_en   DATETIME            NULL
                          COMMENT 'UTC en que el admin confirmó el email. NULL = pendiente.',
    migrado_a_tenant      TINYINT(1)      NOT NULL DEFAULT 0
                          COMMENT '1 = ya existe en innovium_<slug>.users, esta fila queda como histórico.',
    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.',
    PRIMARY KEY (id),
    UNIQUE KEY uq_tenant_admin_users_tenant_email (tenant_id, email),
    KEY idx_tenant_admin_users_migrado (migrado_a_tenant),
    CONSTRAINT fk_tenant_admin_users_tenant
        FOREIGN KEY (tenant_id) REFERENCES tenants (id)
        ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  COMMENT='Admins iniciales de tenants nuevos antes de migrar a users del tenant. Flujo real en Sprint 2.x.';
