-- =============================================================================
-- Migración:    0003_create_tenant_billing_table
-- Sprint:       1.2 — multi-tenancy core (estructura) + 2.x (uso real)
-- Tabla:        tenant_billing
-- Aplica en:    BD maestra (innovium_master)
-- Dependencias: 0001 (tenants).
--
-- Descripción:
--   Datos comerciales del tenant. En Sprint 1.2 esta tabla se crea
--   estructuralmente pero NO se siembra ni se usa: el módulo de billing
--   real (integración con WebPay/Mercado Pago, cálculo de proximo_cobro,
--   estados de morosidad) llega en Sprint 2.x.
--
--   La tabla queda lista para que cuando llegue Sprint 2.x no haya que
--   migrar el schema de master en producción.
--
-- Notas de diseño:
--   - Todas las columnas de negocio son NULLABLE: en 1.2 las filas se
--     insertan vacías junto con el tenant, y se completan después.
--   - estado_billing: ENUM con default 'al_dia' para no bloquear acceso
--     mientras no haya billing real.
--   - UNIQUE(tenant_id): un tenant tiene una sola fila de billing actual.
--     Historial de cambios (planes, montos, métodos de pago) va en una
--     tabla separada en Sprint 2.x.
--   - monto_mensual_clp INT: CLP no usa decimales. INT alcanza para
--     hasta ~2.000 millones, sobra para cualquier plan SaaS.
--   - ON DELETE RESTRICT: ver nota en 0002.
-- =============================================================================

CREATE TABLE tenant_billing (
    id                  BIGINT UNSIGNED NOT NULL AUTO_INCREMENT
                        COMMENT 'PK auto-incremental.',
    tenant_id           BIGINT UNSIGNED NOT NULL
                        COMMENT 'FK → tenants.id (RESTRICT). UNIQUE: una fila por tenant.',
    plan_codigo         VARCHAR(50)         NULL
                        COMMENT 'Identificador del plan contratado (ej: "essential", "pro", "enterprise").',
    monto_mensual_clp   INT UNSIGNED        NULL
                        COMMENT 'Monto en CLP sin decimales. NULL = no facturado todavía.',
    ciclo               ENUM('mensual', 'anual')
                                            NULL
                        COMMENT 'Frecuencia de facturación. NULL = no definido.',
    proximo_cobro       DATE                NULL
                        COMMENT 'Fecha del próximo cobro programado (zona horaria del tenant).',
    metodo_pago         VARCHAR(50)         NULL
                        COMMENT 'Método de pago activo (ej: "transferencia", "webpay", "mercadopago").',
    estado_billing      ENUM('al_dia', 'vencido', 'suspendido')
                        NOT NULL DEFAULT 'al_dia'
                        COMMENT 'Estado de pago. al_dia=OK; vencido=mora; suspendido=acceso bloqueado por morosidad.',
    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_billing_tenant (tenant_id),
    KEY idx_tenant_billing_estado (estado_billing),
    KEY idx_tenant_billing_proximo_cobro (proximo_cobro),
    CONSTRAINT fk_tenant_billing_tenant
        FOREIGN KEY (tenant_id) REFERENCES tenants (id)
        ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  COMMENT='Datos comerciales del tenant. Estructura para Sprint 2.x billing real.';
