BEGIN;

-- =============================================
--  Sistema de eventos (clustering incremental)
-- =============================================

-- ---------------------------------------------
-- 1. TABLA DE EVENTOS (CLUSTERS)
-- ---------------------------------------------
CREATE TABLE IF NOT EXISTS eventos (
    id                  BIGSERIAL PRIMARY KEY,
    creado_en           TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    actualizado_en      TIMESTAMPTZ NOT NULL DEFAULT NOW(),

    -- Datos "semánticos" del evento (para la web)
    titulo              TEXT,
    fecha_inicio        TIMESTAMPTZ,
    fecha_fin           TIMESTAMPTZ,
    n_noticias          INTEGER      NOT NULL DEFAULT 0,

    -- Datos de clustering
    centroid            JSONB        NOT NULL,
    total_traducciones  INTEGER      NOT NULL DEFAULT 1
);

-- ---------------------------------------------
-- 2. COLUMNA evento_id EN TRADUCCIONES
-- ---------------------------------------------
ALTER TABLE traducciones
    ADD COLUMN IF NOT EXISTS evento_id BIGINT REFERENCES eventos(id);

-- ---------------------------------------------
-- 3. TABLA RELACIÓN EVENTO <-> NOTICIA <-> TRADUCCIÓN
-- ---------------------------------------------
CREATE TABLE IF NOT EXISTS eventos_noticias (
    evento_id     BIGINT   NOT NULL REFERENCES eventos(id)      ON DELETE CASCADE,
    noticia_id    CHAR(32) NOT NULL REFERENCES noticias(id)     ON DELETE CASCADE,
    traduccion_id BIGINT   NOT NULL REFERENCES traducciones(id) ON DELETE CASCADE,
    PRIMARY KEY (evento_id, traduccion_id)
);

-- ---------------------------------------------
-- 4. ÍNDICES ÚTILES
-- ---------------------------------------------

-- Consultar traducciones por evento
CREATE INDEX IF NOT EXISTS idx_traducciones_evento
    ON traducciones(evento_id);

CREATE INDEX IF NOT EXISTS idx_traducciones_evento_fecha
    ON traducciones(evento_id, noticia_id);

CREATE INDEX IF NOT EXISTS idx_trad_id
    ON traducciones(id);

-- Ordenar eventos por fecha de inicio
CREATE INDEX IF NOT EXISTS idx_eventos_fecha_inicio
    ON eventos (fecha_inicio DESC NULLS LAST);

-- Relación evento <-> noticia / traducción
CREATE INDEX IF NOT EXISTS idx_eventos_noticias_evento
    ON eventos_noticias (evento_id);

CREATE INDEX IF NOT EXISTS idx_eventos_noticias_noticia
    ON eventos_noticias (noticia_id);

CREATE INDEX IF NOT EXISTS idx_eventos_noticias_traduccion
    ON eventos_noticias (traduccion_id);

-- ---------------------------------------------
-- 5. TRIGGER PARA actualizar "actualizado_en"
-- ---------------------------------------------
CREATE OR REPLACE FUNCTION actualizar_evento_modificado()
RETURNS TRIGGER AS $$
BEGIN
    NEW.actualizado_en = NOW();
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

DROP TRIGGER IF EXISTS trg_evento_modificado ON eventos;

CREATE TRIGGER trg_evento_modificado
BEFORE UPDATE ON eventos
FOR EACH ROW
EXECUTE FUNCTION actualizar_evento_modificado();

COMMIT;

