-- =====================================================================
--  MÓDULO: GENERACIÓN DE IMÁGENES CON IA  (migración ADITIVA, prefijo gi_)
--  No modifica ni elimina ninguna tabla existente. Ejecutar UNA vez.
--  Reversión: DROP TABLE de las tablas gi_* (ver final del archivo).
-- =====================================================================
SET NAMES utf8mb4;
USE `re123_gigantes`;

-- 1) Proveedores/config de IA (la API Key se guarda CIFRADA) ------------
CREATE TABLE IF NOT EXISTS `gi_config_ia` (
  `id`                 INT(11) NOT NULL AUTO_INCREMENT,
  `nombre`             VARCHAR(120) NOT NULL,
  `proveedor`          VARCHAR(40) NOT NULL DEFAULT 'openai',
  `api_url`            VARCHAR(255) DEFAULT 'https://api.openai.com/v1',
  `api_key_enc`        TEXT DEFAULT NULL,               -- cifrada (AES-256)
  `api_key_mask`       VARCHAR(60) DEFAULT NULL,        -- versión visible: sk-***9F2
  `modelo`             VARCHAR(80) DEFAULT 'gpt-image-1',
  `endpoint_generacion` VARCHAR(255) DEFAULT '/images/generations',
  `endpoint_edicion`   VARCHAR(255) DEFAULT '/images/edits',
  `endpoint_remove_bg` VARCHAR(255) DEFAULT NULL,
  `timeout`            INT(11) NOT NULL DEFAULT 120,
  `max_intentos`       INT(11) NOT NULL DEFAULT 2,
  `calidad`            VARCHAR(20) DEFAULT 'high',
  `tamano_salida`      VARCHAR(20) DEFAULT '1024x1024',
  `formato_salida`     VARCHAR(10) DEFAULT 'png',
  `activo`             TINYINT(1) NOT NULL DEFAULT 1,
  `test_resultado`     VARCHAR(255) DEFAULT NULL,
  `test_fecha`         DATETIME DEFAULT NULL,
  `created_at`         TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at`         TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 2) Eventos / campañas -------------------------------------------------
CREATE TABLE IF NOT EXISTS `gi_eventos` (
  `id`                    INT(11) NOT NULL AUTO_INCREMENT,
  `codigo_publico`        VARCHAR(20) NOT NULL,
  `nombre`                VARCHAR(200) NOT NULL,
  `descripcion`           TEXT DEFAULT NULL,
  `fecha_evento`          DATE DEFAULT NULL,
  `hora_inicio`           TIME DEFAULT NULL,
  `hora_termino`          TIME DEFAULT NULL,
  `estado`                ENUM('borrador','activo','pausado','finalizado') NOT NULL DEFAULT 'borrador',
  `logo`                  VARCHAR(255) DEFAULT NULL,
  `portada`               VARCHAR(255) DEFAULT NULL,
  `prompt_principal`      TEXT DEFAULT NULL,
  `prompt_negativo`       TEXT DEFAULT NULL,
  `max_fondos_activos`    INT(11) NOT NULL DEFAULT 0,     -- 0 = sin límite
  `formato_salida`        VARCHAR(30) DEFAULT '1:1',
  `resolucion`            VARCHAR(20) DEFAULT '1024x1024',
  `calidad`               VARCHAR(20) DEFAULT 'high',
  `metodo_fondo`          VARCHAR(30) NOT NULL DEFAULT 'aleatorio',
  `aprobacion`            ENUM('automatica','manual') NOT NULL DEFAULT 'manual',
  `publicacion`           ENUM('automatica','manual') NOT NULL DEFAULT 'manual',
  `tiempo_proyeccion`     INT(11) NOT NULL DEFAULT 8,
  `max_fotos_dispositivo` INT(11) NOT NULL DEFAULT 3,
  `dias_eliminar_originales` INT(11) NOT NULL DEFAULT 0,   -- 0 = no eliminar
  `ia_config_id`          INT(11) DEFAULT NULL,
  `msg_bienvenida`        VARCHAR(255) DEFAULT NULL,
  `msg_procesando`        VARCHAR(255) DEFAULT NULL,
  `msg_completado`        VARCHAR(255) DEFAULT NULL,
  `msg_error`             VARCHAR(255) DEFAULT NULL,
  `texto_autorizacion`    TEXT DEFAULT NULL,
  `version_texto_aut`     INT(11) NOT NULL DEFAULT 1,
  `permitir_descarga`     TINYINT(1) NOT NULL DEFAULT 1,
  `permitir_regenerar`    TINYINT(1) NOT NULL DEFAULT 1,
  `qr_activo`             TINYINT(1) NOT NULL DEFAULT 1,
  `ultimo_fondo_id`       INT(11) DEFAULT NULL,
  `limite_api_evento`     INT(11) NOT NULL DEFAULT 0,     -- 0 = sin límite (nº de generaciones)
  `version_token`         BIGINT NOT NULL DEFAULT 0,
  `usuario_admin_id`      INT(11) DEFAULT NULL,
  `created_at`            TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at`            TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_codigo` (`codigo_publico`),
  KEY `idx_estado` (`estado`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 3) Fondos por evento --------------------------------------------------
CREATE TABLE IF NOT EXISTS `gi_fondos` (
  `id`               INT(11) NOT NULL AUTO_INCREMENT,
  `evento_id`        INT(11) NOT NULL,
  `nombre`           VARCHAR(160) DEFAULT NULL,
  `archivo`          VARCHAR(255) NOT NULL,
  `miniatura`        VARCHAR(255) DEFAULT NULL,
  `formato`          VARCHAR(10) DEFAULT NULL,
  `ancho`            INT(11) DEFAULT NULL,
  `alto`             INT(11) DEFAULT NULL,
  `aspecto`          VARCHAR(20) DEFAULT NULL,
  `orden`            INT(11) NOT NULL DEFAULT 0,
  `activo`           TINYINT(1) NOT NULL DEFAULT 1,
  `prompt`           TEXT DEFAULT NULL,
  `prompt_negativo`  TEXT DEFAULT NULL,
  `posicion_persona` VARCHAR(40) DEFAULT NULL,
  `tamano_persona`   VARCHAR(40) DEFAULT NULL,
  `max_personas`     INT(11) NOT NULL DEFAULT 0,
  `categoria`        VARCHAR(80) DEFAULT NULL,
  `proteger_textos`  TINYINT(1) NOT NULL DEFAULT 1,
  `usos`             INT(11) NOT NULL DEFAULT 0,
  `created_at`       TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_evento` (`evento_id`,`activo`,`orden`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 4) Fotografías originales --------------------------------------------
CREATE TABLE IF NOT EXISTS `gi_fotos_originales` (
  `id`             INT(11) NOT NULL AUTO_INCREMENT,
  `evento_id`      INT(11) NOT NULL,
  `archivo`        VARCHAR(255) NOT NULL,
  `miniatura`      VARCHAR(255) DEFAULT NULL,
  `origen`         ENUM('admin','qr') NOT NULL DEFAULT 'qr',
  `nombre_interno` VARCHAR(160) DEFAULT NULL,
  `navegador_hash` CHAR(64) DEFAULT NULL,
  `ip_hash`        CHAR(64) DEFAULT NULL,
  `token_hash`     CHAR(64) DEFAULT NULL,
  `ancho`          INT(11) DEFAULT NULL,
  `alto`           INT(11) DEFAULT NULL,
  `eliminada`      TINYINT(1) NOT NULL DEFAULT 0,
  `created_at`     TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_evento` (`evento_id`),
  KEY `idx_nav` (`navegador_hash`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 5) Autorizaciones (consentimiento) -----------------------------------
CREATE TABLE IF NOT EXISTS `gi_autorizaciones` (
  `id`            INT(11) NOT NULL AUTO_INCREMENT,
  `evento_id`     INT(11) NOT NULL,
  `foto_id`       INT(11) DEFAULT NULL,
  `ip_hash`       CHAR(64) DEFAULT NULL,
  `token`         VARCHAR(80) DEFAULT NULL,
  `version_texto` INT(11) NOT NULL DEFAULT 1,
  `created_at`    TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_evento` (`evento_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 6) Cola de trabajos ---------------------------------------------------
CREATE TABLE IF NOT EXISTS `gi_trabajos` (
  `id`            INT(11) NOT NULL AUTO_INCREMENT,
  `evento_id`     INT(11) NOT NULL,
  `foto_id`       INT(11) NOT NULL,
  `fondo_id`      INT(11) DEFAULT NULL,
  `ia_config_id`  INT(11) DEFAULT NULL,
  `estado`        VARCHAR(30) NOT NULL DEFAULT 'pendiente',
  `fase`          VARCHAR(60) DEFAULT NULL,
  `prompt_final`  TEXT DEFAULT NULL,
  `instrucciones` TEXT DEFAULT NULL,
  `intentos`      INT(11) NOT NULL DEFAULT 0,
  `max_intentos`  INT(11) NOT NULL DEFAULT 2,
  `tiempo_ms`     INT(11) DEFAULT NULL,
  `error_msg`     TEXT DEFAULT NULL,
  `resultado_id`  INT(11) DEFAULT NULL,
  `token`         VARCHAR(80) DEFAULT NULL,      -- token para consulta pública
  `created_at`    TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at`    TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `started_at`    DATETIME DEFAULT NULL,
  `finished_at`   DATETIME DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_estado` (`estado`),
  KEY `idx_evento` (`evento_id`),
  KEY `idx_token` (`token`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 7) Imágenes generadas -------------------------------------------------
CREATE TABLE IF NOT EXISTS `gi_imagenes` (
  `id`             INT(11) NOT NULL AUTO_INCREMENT,
  `evento_id`      INT(11) NOT NULL,
  `trabajo_id`     INT(11) DEFAULT NULL,
  `foto_id`        INT(11) DEFAULT NULL,
  `fondo_id`       INT(11) DEFAULT NULL,
  `archivo`        VARCHAR(255) NOT NULL,
  `miniatura`      VARCHAR(255) DEFAULT NULL,
  `ancho`          INT(11) DEFAULT NULL,
  `alto`           INT(11) DEFAULT NULL,
  `estado`         ENUM('pendiente_aprobacion','aprobada','rechazada') NOT NULL DEFAULT 'pendiente_aprobacion',
  `destacada`      TINYINT(1) NOT NULL DEFAULT 0,
  `en_slider`      TINYINT(1) NOT NULL DEFAULT 0,
  `galeria_foto_id` INT(11) DEFAULT NULL,        -- id en galeria_fotos (slider existente)
  `descargas`      INT(11) NOT NULL DEFAULT 0,
  `origen`         ENUM('admin','qr') NOT NULL DEFAULT 'qr',
  `created_at`     TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at`     TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_evento` (`evento_id`,`estado`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 8) Consumo de API -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `gi_consumo` (
  `id`         INT(11) NOT NULL AUTO_INCREMENT,
  `evento_id`  INT(11) DEFAULT NULL,
  `trabajo_id` INT(11) DEFAULT NULL,
  `proveedor`  VARCHAR(40) DEFAULT NULL,
  `modelo`     VARCHAR(80) DEFAULT NULL,
  `llamadas`   INT(11) NOT NULL DEFAULT 1,
  `unidades`   INT(11) DEFAULT NULL,
  `costo`      DECIMAL(10,4) DEFAULT NULL,
  `resultado`  VARCHAR(20) DEFAULT NULL,
  `tiempo_ms`  INT(11) DEFAULT NULL,
  `error_msg`  TEXT DEFAULT NULL,
  `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_evento` (`evento_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 9) Historial / auditoría ---------------------------------------------
CREATE TABLE IF NOT EXISTS `gi_historial` (
  `id`               INT(11) NOT NULL AUTO_INCREMENT,
  `evento_id`        INT(11) DEFAULT NULL,
  `accion`           VARCHAR(60) NOT NULL,
  `usuario_admin_id` INT(11) DEFAULT NULL,
  `descripcion`      VARCHAR(500) DEFAULT NULL,
  `created_at`       TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_evento` (`evento_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 10) Configuración general del módulo (clave/valor) -------------------
CREATE TABLE IF NOT EXISTS `gi_config` (
  `clave` VARCHAR(80) NOT NULL,
  `valor` TEXT DEFAULT NULL,
  PRIMARY KEY (`clave`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO `gi_config` (`clave`,`valor`) VALUES
('modulo_activo','1'),
('max_carga_mb','12'),
('formatos_permitidos','jpg,jpeg,png,webp'),
('trabajos_simultaneos','2'),
('pausa_entre_solicitudes','1'),
('worker_token', SUBSTRING(MD5(RAND()),1,24)),
('rate_min_segundos','8'),
('max_por_ip_hora','40')
ON DUPLICATE KEY UPDATE `clave`=`clave`;

-- =====================================================================
--  REVERSIÓN (si se necesitara deshacer):
--  DROP TABLE gi_consumo, gi_imagenes, gi_trabajos, gi_autorizaciones,
--    gi_fotos_originales, gi_fondos, gi_eventos, gi_config_ia,
--    gi_historial, gi_config;
-- =====================================================================
