CREATE TABLE IF NOT EXISTS billing_monedas (
 id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
 codigo CHAR(3) NOT NULL UNIQUE,
 nombre VARCHAR(80) NOT NULL,
 simbolo VARCHAR(8) NOT NULL,
 decimales TINYINT UNSIGNED NOT NULL DEFAULT 2,
 redondeo_incremento DECIMAL(12,4) NOT NULL DEFAULT 0.01,
 estado ENUM('activo','inactivo') NOT NULL DEFAULT 'activo',
 creado_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
 actualizado_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS billing_listas_precios (
 id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
 codigo VARCHAR(60) NOT NULL UNIQUE,
 nombre VARCHAR(120) NOT NULL,
 moneda CHAR(3) NOT NULL,
 pais_codigo CHAR(2) NULL,
 region_codigo VARCHAR(40) NULL,
 es_predeterminada TINYINT(1) NOT NULL DEFAULT 0,
 impuestos_incluidos TINYINT(1) NOT NULL DEFAULT 0,
 estado ENUM('borrador','activo','retirado') NOT NULL DEFAULT 'activo',
 vigente_desde DATETIME NULL,
 vigente_hasta DATETIME NULL,
 creado_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
 actualizado_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 KEY ix_billing_lista_region(pais_codigo,region_codigo,estado),
 CONSTRAINT fk_billing_lista_moneda FOREIGN KEY(moneda) REFERENCES billing_monedas(codigo)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS billing_lista_precios_items (
 id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
 id_lista BIGINT UNSIGNED NOT NULL,
 id_plan BIGINT UNSIGNED NOT NULL,
 precio_mensual DECIMAL(12,2) NOT NULL DEFAULT 0,
 precio_anual DECIMAL(12,2) NOT NULL DEFAULT 0,
 precio_desde TINYINT(1) NOT NULL DEFAULT 0,
 creado_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
 actualizado_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 UNIQUE KEY uq_billing_lista_plan(id_lista,id_plan),
 CONSTRAINT fk_billing_item_lista FOREIGN KEY(id_lista) REFERENCES billing_listas_precios(id) ON DELETE CASCADE,
 CONSTRAINT fk_billing_item_plan FOREIGN KEY(id_plan) REFERENCES billing_planes(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS billing_impuestos (
 id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
 codigo VARCHAR(60) NOT NULL UNIQUE,
 nombre VARCHAR(120) NOT NULL,
 pais_codigo CHAR(2) NULL,
 porcentaje DECIMAL(7,4) NOT NULL DEFAULT 0,
 incluido_en_precio TINYINT(1) NOT NULL DEFAULT 0,
 estado ENUM('activo','inactivo') NOT NULL DEFAULT 'activo',
 vigente_desde DATETIME NULL,
 vigente_hasta DATETIME NULL,
 creado_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
 actualizado_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS billing_suscripcion_precio_snapshot (
 id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
 id_suscripcion BIGINT UNSIGNED NOT NULL,
 id_lista BIGINT UNSIGNED NULL,
 moneda CHAR(3) NOT NULL,
 ciclo ENUM('mensual','anual') NOT NULL,
 precio_neto DECIMAL(12,2) NOT NULL,
 impuesto_porcentaje DECIMAL(7,4) NOT NULL DEFAULT 0,
 impuesto_monto DECIMAL(12,2) NOT NULL DEFAULT 0,
 precio_total DECIMAL(12,2) NOT NULL,
 pais_codigo CHAR(2) NULL,
 metadata_json LONGTEXT NULL,
 vigente_desde DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
 vigente_hasta DATETIME NULL,
 creado_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
 KEY ix_billing_snapshot_suscripcion(id_suscripcion,vigente_hasta),
 CONSTRAINT fk_billing_snapshot_suscripcion FOREIGN KEY(id_suscripcion) REFERENCES billing_suscripciones(id) ON DELETE CASCADE,
 CONSTRAINT fk_billing_snapshot_lista FOREIGN KEY(id_lista) REFERENCES billing_listas_precios(id) ON DELETE SET NULL,
 CONSTRAINT fk_billing_snapshot_moneda FOREIGN KEY(moneda) REFERENCES billing_monedas(codigo)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS billing_proveedores (
 id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
 codigo VARCHAR(40) NOT NULL UNIQUE,
 nombre VARCHAR(100) NOT NULL,
 modo ENUM('sandbox','produccion') NOT NULL DEFAULT 'sandbox',
 estado ENUM('inactivo','configuracion','validado','activo','error') NOT NULL DEFAULT 'inactivo',
 prioridad INT NOT NULL DEFAULT 100,
 monedas_json LONGTEXT NULL,
 paises_json LONGTEXT NULL,
 credenciales_configuradas TINYINT(1) NOT NULL DEFAULT 0,
 ultima_validacion_en DATETIME NULL,
 metadata_json LONGTEXT NULL,
 creado_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
 actualizado_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO billing_monedas(codigo,nombre,simbolo,decimales,redondeo_incremento,estado) VALUES
('USD','Dólar estadounidense','$',2,0.01,'activo'),('PEN','Sol peruano','S/',2,0.10,'activo'),('EUR','Euro','€',2,0.01,'activo')
ON DUPLICATE KEY UPDATE nombre=VALUES(nombre),simbolo=VALUES(simbolo),estado='activo';
INSERT INTO billing_listas_precios(codigo,nombre,moneda,pais_codigo,region_codigo,es_predeterminada,impuestos_incluidos,estado,vigente_desde) VALUES
('GLOBAL_USD','Internacional USD','USD',NULL,'GLOBAL',1,0,'activo',NOW()),
('PERU_PEN','Perú PEN','PEN','PE','LATAM',0,1,'activo',NOW()),
('EUROPA_EUR','Europa EUR','EUR',NULL,'EUROPE',0,1,'activo',NOW())
ON DUPLICATE KEY UPDATE nombre=VALUES(nombre),moneda=VALUES(moneda),pais_codigo=VALUES(pais_codigo),region_codigo=VALUES(region_codigo),estado='activo';
INSERT INTO billing_lista_precios_items(id_lista,id_plan,precio_mensual,precio_anual,precio_desde)
SELECT l.id,p.id,CASE p.codigo WHEN 'starter' THEN 0 WHEN 'family' THEN 12 WHEN 'pro' THEN 49 WHEN 'studio' THEN 99 ELSE p.precio_mensual END,CASE p.codigo WHEN 'starter' THEN 0 WHEN 'family' THEN 115 WHEN 'pro' THEN 470 WHEN 'studio' THEN 950 ELSE p.precio_anual END,IF(p.codigo='studio',1,0)
FROM billing_listas_precios l JOIN billing_planes p ON p.estado='activo' WHERE l.codigo='GLOBAL_USD'
ON DUPLICATE KEY UPDATE precio_mensual=VALUES(precio_mensual),precio_anual=VALUES(precio_anual),precio_desde=VALUES(precio_desde);
INSERT INTO billing_lista_precios_items(id_lista,id_plan,precio_mensual,precio_anual,precio_desde)
SELECT l.id,p.id,CASE p.codigo WHEN 'starter' THEN 0 WHEN 'family' THEN 45 WHEN 'pro' THEN 185 WHEN 'studio' THEN 375 ELSE 0 END,CASE p.codigo WHEN 'starter' THEN 0 WHEN 'family' THEN 430 WHEN 'pro' THEN 1775 WHEN 'studio' THEN 3600 ELSE 0 END,IF(p.codigo='studio',1,0)
FROM billing_listas_precios l JOIN billing_planes p ON p.estado='activo' WHERE l.codigo='PERU_PEN'
ON DUPLICATE KEY UPDATE precio_mensual=VALUES(precio_mensual),precio_anual=VALUES(precio_anual),precio_desde=VALUES(precio_desde);
INSERT INTO billing_lista_precios_items(id_lista,id_plan,precio_mensual,precio_anual,precio_desde)
SELECT l.id,p.id,CASE p.codigo WHEN 'starter' THEN 0 WHEN 'family' THEN 11 WHEN 'pro' THEN 45 WHEN 'studio' THEN 92 ELSE 0 END,CASE p.codigo WHEN 'starter' THEN 0 WHEN 'family' THEN 105 WHEN 'pro' THEN 430 WHEN 'studio' THEN 885 ELSE 0 END,IF(p.codigo='studio',1,0)
FROM billing_listas_precios l JOIN billing_planes p ON p.estado='activo' WHERE l.codigo='EUROPA_EUR'
ON DUPLICATE KEY UPDATE precio_mensual=VALUES(precio_mensual),precio_anual=VALUES(precio_anual),precio_desde=VALUES(precio_desde);
INSERT INTO billing_impuestos(codigo,nombre,pais_codigo,porcentaje,incluido_en_precio,estado,vigente_desde) VALUES
('PE_IGV','IGV Perú','PE',18.0000,1,'activo',NOW()),('GLOBAL_NONE','Sin impuesto global',NULL,0.0000,0,'activo',NOW())
ON DUPLICATE KEY UPDATE nombre=VALUES(nombre),porcentaje=VALUES(porcentaje),incluido_en_precio=VALUES(incluido_en_precio),estado='activo';
INSERT INTO billing_proveedores(codigo,nombre,modo,estado,prioridad,monedas_json,paises_json,credenciales_configuradas) VALUES
('stripe','Stripe','sandbox','inactivo',10,JSON_ARRAY('USD','EUR'),JSON_ARRAY('GLOBAL','EUROPE'),0),
('mercadopago','Mercado Pago','sandbox','inactivo',20,JSON_ARRAY('PEN','USD'),JSON_ARRAY('PE','LATAM'),0),
('paypal','PayPal','sandbox','inactivo',30,JSON_ARRAY('USD','EUR'),JSON_ARRAY('GLOBAL'),0)
ON DUPLICATE KEY UPDATE nombre=VALUES(nombre),prioridad=VALUES(prioridad),monedas_json=VALUES(monedas_json),paises_json=VALUES(paises_json);
INSERT INTO org_permisos(codigo,modulo,nombre,descripcion) VALUES('billing.regional.manage','billing','Administrar precios regionales','Owner-only: monedas, listas, impuestos y proveedores')
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='billing.regional.manage' WHERE r.codigo IN ('owner','platform_owner','superadmin','admin_plataforma');
