-- Sprint 25B: experiencia guiada, procesamiento, confirmación y onboarding.
-- Compatibilidad acumulativa con el esquema real heredado de checkout.
-- No conecta pasarelas, no almacena credenciales y no realiza cargos.

ALTER TABLE billing_checkout_sesiones
  ADD COLUMN IF NOT EXISTS uuid_publico CHAR(36) NULL AFTER id,
  ADD COLUMN IF NOT EXISTS id_suscripcion BIGINT UNSIGNED NULL AFTER id_empresa,
  ADD COLUMN IF NOT EXISTS proveedor VARCHAR(60) NULL AFTER id_plan,
  ADD COLUMN IF NOT EXISTS proveedor_sesion_id VARCHAR(190) NULL AFTER proveedor,
  ADD COLUMN IF NOT EXISTS retorno_url VARCHAR(900) NULL AFTER idempotency_key,
  ADD COLUMN IF NOT EXISTS cancelacion_url VARCHAR(900) NULL AFTER retorno_url,
  ADD COLUMN IF NOT EXISTS metadata_json LONGTEXT NULL AFTER cancelacion_url,
  ADD COLUMN IF NOT EXISTS creado_por BIGINT UNSIGNED NULL AFTER metadata_json,
  ADD COLUMN IF NOT EXISTS vence_en DATETIME NULL AFTER creado_en,
  ADD COLUMN IF NOT EXISTS completada_en DATETIME NULL AFTER vence_en;

UPDATE billing_checkout_sesiones
SET uuid_publico=UUID()
WHERE uuid_publico IS NULL OR TRIM(uuid_publico)='';

UPDATE billing_checkout_sesiones
SET proveedor='manual'
WHERE proveedor IS NULL OR TRIM(proveedor)='';

UPDATE billing_checkout_sesiones
SET vence_en=DATE_ADD(COALESCE(creado_en,NOW()),INTERVAL 30 MINUTE)
WHERE vence_en IS NULL;

ALTER TABLE billing_checkout_sesiones
  ADD UNIQUE INDEX IF NOT EXISTS uq_checkout_uuid_publico (uuid_publico),
  ADD INDEX IF NOT EXISTS idx_checkout_empresa_estado_guiado (id_empresa,estado,vence_en);

CREATE TABLE IF NOT EXISTS billing_checkout_eventos (
  id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  id_checkout BIGINT UNSIGNED NOT NULL,
  id_empresa BIGINT UNSIGNED NOT NULL,
  id_usuario BIGINT UNSIGNED NULL,
  evento VARCHAR(80) NOT NULL,
  metadata_json LONGTEXT NULL,
  creado_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  KEY idx_bce_checkout_fecha (id_checkout,creado_en),
  KEY idx_bce_empresa_fecha (id_empresa,creado_en),
  CONSTRAINT fk_bce_checkout FOREIGN KEY(id_checkout) REFERENCES billing_checkout_sesiones(id) ON DELETE CASCADE,
  CONSTRAINT fk_bce_empresa FOREIGN KEY(id_empresa) REFERENCES org_empresas(id) ON DELETE CASCADE,
  CONSTRAINT fk_bce_usuario FOREIGN KEY(id_usuario) REFERENCES org_usuarios(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS billing_onboarding_progreso (
  id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  id_empresa BIGINT UNSIGNED NOT NULL,
  id_checkout BIGINT UNSIGNED NOT NULL,
  estado ENUM('lista','en_progreso','completado') NOT NULL DEFAULT 'lista',
  paso_actual ENUM('confirmacion','primer_caso','primer_documento','completado') NOT NULL DEFAULT 'confirmacion',
  iniciado_en DATETIME NULL,
  completado_en DATETIME NULL,
  actualizado_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  UNIQUE KEY uq_bop_checkout (id_checkout),
  KEY idx_bop_empresa_estado (id_empresa,estado),
  CONSTRAINT fk_bop_empresa FOREIGN KEY(id_empresa) REFERENCES org_empresas(id) ON DELETE CASCADE,
  CONSTRAINT fk_bop_checkout FOREIGN KEY(id_checkout) REFERENCES billing_checkout_sesiones(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO org_permisos(codigo,modulo,nombre,descripcion)
VALUES
('billing.onboarding.manage','billing','Administrar onboarding comercial',
 'Permite iniciar el onboarding después de una activación de checkout aprobada.')
ON DUPLICATE KEY UPDATE modulo=VALUES(modulo),nombre=VALUES(nombre),descripcion=VALUES(descripcion);

INSERT IGNORE INTO org_roles_permisos(id_rol,id_permiso)
SELECT r.id,p.id
FROM org_roles r
JOIN org_permisos p ON p.codigo IN('billing.checkout.manage','billing.onboarding.manage')
WHERE r.codigo IN(
 'owner_plataforma','admin_empresa',
 'owner','admin','cliente_admin',
 'platform_owner','superadmin','admin_plataforma'
);

-- No se asignan permisos de checkout interno a cliente, consulta ni portal.
