-- ============================================================
-- Migración v2: métodos de análisis con combinaciones completas
-- y probabilidades. Es aditiva: no toca tablas existentes.
-- ============================================================
USE hackruzc_analisis;

-- Una "corrida" = una ejecución de todos los métodos sobre un sorteo base
CREATE TABLE IF NOT EXISTS analisis_corridas (
    id               INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    loteria_id       TINYINT UNSIGNED NOT NULL,
    sorteo_base_id   INT UNSIGNED NULL,
    n_sorteos        INT UNSIGNED NOT NULL,
    semilla          INT NOT NULL,
    notas_json       LONGTEXT NULL,
    created_at       TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    KEY idx_lot (loteria_id, id),
    FOREIGN KEY (loteria_id) REFERENCES loterias(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Combinaciones completas por método, con sus probabilidades
CREATE TABLE IF NOT EXISTS analisis_combinaciones (
    id                 INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    corrida_id         INT UNSIGNED NOT NULL,
    loteria_id         TINYINT UNSIGNED NOT NULL,
    metodo             VARCHAR(40) NOT NULL,
    capa               TINYINT UNSIGNED NOT NULL,
    ranking            TINYINT UNSIGNED NOT NULL DEFAULT 1,
    numeros_json       VARCHAR(255) NOT NULL,          -- [3,14,22,31,40,52]
    prob_modelo        DOUBLE NOT NULL,                -- P(combinación) bajo el modelo del método
    prob_exacta        DOUBLE NOT NULL,                -- 1 / C(N,k): probabilidad real de acertar el premio mayor
    uno_en_exacta      BIGINT UNSIGNED NOT NULL,       -- C(N,k)
    lift_modelo        DOUBLE NOT NULL,                -- prob_modelo / prob_exacta (1.0 = sin ventaja)
    z_filtro           DOUBLE NULL,                    -- P(un sorteo cumple los filtros del método) estimado
    prob_aciertos_json LONGTEXT NULL,                  -- P(exactamente m aciertos), hipergeométrica exacta
    detalle_json       LONGTEXT NULL,
    created_at         TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    KEY idx_corrida (corrida_id, metodo),
    KEY idx_lot_metodo (loteria_id, metodo, id),
    FOREIGN KEY (corrida_id) REFERENCES analisis_corridas(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Probabilidad por número (inclusión en el próximo sorteo) según cada método
CREATE TABLE IF NOT EXISTS analisis_prob_numero (
    id            INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    corrida_id    INT UNSIGNED NOT NULL,
    metodo        VARCHAR(40) NOT NULL,
    numero        TINYINT UNSIGNED NOT NULL,
    peso          DOUBLE NOT NULL,                     -- peso normalizado del método (suma 1)
    prob_incluye  DOUBLE NULL,                         -- P(el número sale en el sorteo), simulada
    UNIQUE KEY uq (corrida_id, metodo, numero),
    FOREIGN KEY (corrida_id) REFERENCES analisis_corridas(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Validación cronológica (walk-forward) por método
CREATE TABLE IF NOT EXISTS analisis_validacion (
    id               INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    loteria_id       TINYINT UNSIGNED NOT NULL,
    metodo           VARCHAR(40) NOT NULL,
    ventana          SMALLINT UNSIGNED NOT NULL,       -- sorteos evaluados
    llr_medio        DOUBLE NOT NULL,                  -- log(P_modelo/P_azar) medio por sorteo (nats)
    llr_se           DOUBLE NOT NULL,
    t_stat           DOUBLE NOT NULL,
    cobertura_filtro DOUBLE NULL,                      -- % de sorteos reales que cumplen los filtros
    cobertura_azar   DOUBLE NULL,                      -- % esperado si todo fuera azar
    aciertos_prom    DOUBLE NULL,
    aciertos_azar    DOUBLE NULL,
    peso_ensemble    DOUBLE NOT NULL DEFAULT 0,
    created_at       TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    KEY idx_lot_metodo (loteria_id, metodo, id),
    FOREIGN KEY (loteria_id) REFERENCES loterias(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
