-- Sprint 24E: checkout y autoservicio. Sin cargos reales ni credenciales.
CREATE TABLE IF NOT EXISTS billing_checkout_sesiones (
 id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
 uuid CHAR(36) NOT NULL,
 id_empresa BIGINT UNSIGNED NOT NULL,
 id_usuario BIGINT UNSIGNED NULL,
 id_plan BIGINT UNSIGNED NOT NULL,
 id_lista_precio BIGINT UNSIGNED NULL,
 proveedor_codigo VARCHAR(40) NULL,
 ciclo ENUM('mensual','anual') NOT NULL DEFAULT 'mensual',
 pais_codigo CHAR(2) NULL,
 moneda CHAR(3) NOT NULL,
 subtotal DECIMAL(14,2) NOT NULL DEFAULT 0,
 impuesto DECIMAL(14,2) NOT NULL DEFAULT 0,
 total DECIMAL(14,2) NOT NULL DEFAULT 0,
 estado ENUM('pendiente','procesando','aprobado','rechazado','cancelado','expirado') NOT NULL DEFAULT 'pendiente',
 idempotency_key VARCHAR(120) NOT NULL,
 precio_snapshot_json JSON NOT NULL,
 expira_en DATETIME NOT NULL,
 aprobado_en DATETIME NULL,
 creado_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
 actualizado_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 UNIQUE KEY uq_checkout_uuid(uuid),
 UNIQUE KEY uq_checkout_idempotency(idempotency_key),
 KEY idx_checkout_empresa_estado(id_empresa,estado),
 CONSTRAINT fk_checkout_empresa FOREIGN KEY(id_empresa) REFERENCES org_empresas(id),
 CONSTRAINT fk_checkout_plan FOREIGN KEY(id_plan) REFERENCES billing_planes(id),
 CONSTRAINT fk_checkout_lista FOREIGN KEY(id_lista_precio) REFERENCES billing_listas_precios(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;


-- Compatibilidad con instalaciones donde billing_checkout_sesiones ya existía.
-- CREATE TABLE IF NOT EXISTS no agrega columnas, ENUM ni índices faltantes.
ALTER TABLE billing_checkout_sesiones
  ADD COLUMN IF NOT EXISTS idempotency_key VARCHAR(120) NULL AFTER estado;

UPDATE billing_checkout_sesiones
SET idempotency_key = CONCAT('legacy-', id)
WHERE idempotency_key IS NULL OR TRIM(idempotency_key) = '';

ALTER TABLE billing_checkout_sesiones
  MODIFY COLUMN estado ENUM('pendiente','procesando','aprobado','rechazado','cancelado','expirado') NOT NULL DEFAULT 'pendiente',
  MODIFY COLUMN idempotency_key VARCHAR(120) NOT NULL;

ALTER TABLE billing_checkout_sesiones
  ADD UNIQUE INDEX IF NOT EXISTS uq_checkout_idempotency (idempotency_key);

CREATE TABLE IF NOT EXISTS billing_comprobantes (
 id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
 uuid CHAR(36) NOT NULL,
 id_empresa BIGINT UNSIGNED NOT NULL,
 id_transaccion BIGINT UNSIGNED NULL,
 id_checkout BIGINT UNSIGNED NULL,
 tipo VARCHAR(30) NOT NULL DEFAULT 'recibo',
 serie VARCHAR(20) NULL,
 numero VARCHAR(40) NULL,
 moneda CHAR(3) NOT NULL,
 total DECIMAL(14,2) NOT NULL DEFAULT 0,
 estado ENUM('emitido','anulado','pendiente') NOT NULL DEFAULT 'pendiente',
 emitido_en DATETIME NULL,
 metadata_json JSON NULL,
 creado_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
 UNIQUE KEY uq_comprobante_uuid(uuid),
 KEY idx_comprobante_empresa(id_empresa,creado_en),
 CONSTRAINT fk_comprobante_empresa FOREIGN KEY(id_empresa) REFERENCES org_empresas(id),
 CONSTRAINT fk_comprobante_checkout FOREIGN KEY(id_checkout) REFERENCES billing_checkout_sesiones(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO org_permisos(codigo,modulo,nombre,descripcion)
SELECT 'billing.checkout.manage','billing','Administrar checkout y suscripción','Permite gestionar checkout y autoservicio de la organización.'
WHERE NOT EXISTS(SELECT 1 FROM org_permisos WHERE codigo='billing.checkout.manage');
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='billing.checkout.manage'
WHERE r.codigo IN('owner','admin','cliente_admin');
