-- Migration para CR Nº 3 - Novos campos para Campanhas Sorteio e Troca
-- Data: 11/12/2025

-- Adicionar campos para Campanha Sorteio
DO $$ 
BEGIN
    -- Periodicidade de atribuição de prémios (obrigatório para sorteio)
    IF NOT EXISTS (
        SELECT 1 FROM information_schema.columns 
        WHERE table_name='campaigns' AND column_name='draw_periodicity'
    ) THEN
        ALTER TABLE campaigns ADD COLUMN draw_periodicity VARCHAR(20);
        COMMENT ON COLUMN campaigns.draw_periodicity IS 'Periodicidade de atribuição de prémios: daily, weekly, monthly, event';
        RAISE NOTICE 'Coluna draw_periodicity adicionada';
    END IF;
    
    -- Pontos necessários por participação no sorteio
    IF NOT EXISTS (
        SELECT 1 FROM information_schema.columns 
        WHERE table_name='campaigns' AND column_name='draw_points_per_participation'
    ) THEN
        ALTER TABLE campaigns ADD COLUMN draw_points_per_participation INTEGER;
        COMMENT ON COLUMN campaigns.draw_points_per_participation IS 'Pontos necessários para participar no sorteio';
        RAISE NOTICE 'Coluna draw_points_per_participation adicionada';
    END IF;
    
    -- Lista de prémios por fase (JSONB)
    IF NOT EXISTS (
        SELECT 1 FROM information_schema.columns 
        WHERE table_name='campaigns' AND column_name='draw_prizes_list'
    ) THEN
        ALTER TABLE campaigns ADD COLUMN draw_prizes_list JSONB;
        COMMENT ON COLUMN campaigns.draw_prizes_list IS 'Lista de prémios por fase do sorteio';
        RAISE NOTICE 'Coluna draw_prizes_list adicionada';
    END IF;
    
    -- Lista de prémios para troca (JSONB) - obrigatório para campanha troca
    IF NOT EXISTS (
        SELECT 1 FROM information_schema.columns 
        WHERE table_name='campaigns' AND column_name='exchange_prizes_list'
    ) THEN
        ALTER TABLE campaigns ADD COLUMN exchange_prizes_list JSONB;
        COMMENT ON COLUMN campaigns.exchange_prizes_list IS 'Lista de prémios disponíveis para troca (obrigatório para RewardType_Exchange)';
        RAISE NOTICE 'Coluna exchange_prizes_list adicionada';
    END IF;
    
    -- Campo para rastrear pontos decrementados após vencer (para sorteio)
    IF NOT EXISTS (
        SELECT 1 FROM information_schema.columns 
        WHERE table_name='campaign_participations' AND column_name='points_decremented_after_win'
    ) THEN
        ALTER TABLE campaign_participations ADD COLUMN points_decremented_after_win INTEGER DEFAULT 0;
        COMMENT ON COLUMN campaign_participations.points_decremented_after_win IS 'Pontos decrementados após vencer prémio no sorteio';
        RAISE NOTICE 'Coluna points_decremented_after_win adicionada em campaign_participations';
    END IF;
    
    -- Campo para rastrear bilhetes virtuais (para sorteio com probabilidade proporcional)
    IF NOT EXISTS (
        SELECT 1 FROM information_schema.columns 
        WHERE table_name='campaign_participations' AND column_name='virtual_tickets'
    ) THEN
        ALTER TABLE campaign_participations ADD COLUMN virtual_tickets INTEGER DEFAULT 0;
        COMMENT ON COLUMN campaign_participations.virtual_tickets IS 'Número de bilhetes virtuais (proporcional aos pontos) para sorteio';
        RAISE NOTICE 'Coluna virtual_tickets adicionada em campaign_participations';
    END IF;
    
    -- Campo para rastrear qual prémio foi ganho (para sorteio)
    IF NOT EXISTS (
        SELECT 1 FROM information_schema.columns 
        WHERE table_name='campaign_participations' AND column_name='prize_won_id'
    ) THEN
        ALTER TABLE campaign_participations ADD COLUMN prize_won_id VARCHAR(64);
        COMMENT ON COLUMN campaign_participations.prize_won_id IS 'ID do prémio ganho no sorteio';
        RAISE NOTICE 'Coluna prize_won_id adicionada em campaign_participations';
    END IF;
END $$;

-- Criar tabela para prémios de troca (se necessário para melhor estruturação)
CREATE TABLE IF NOT EXISTS campaign_exchange_prizes (
    prize_id VARCHAR(64) PRIMARY KEY,
    campaign_id VARCHAR(64) REFERENCES campaigns(campaign_id) ON DELETE CASCADE,
    name VARCHAR(255) NOT NULL,
    description TEXT,
    price_mt NUMERIC(14,2),
    points_required INTEGER NOT NULL,
    stock INTEGER DEFAULT 0,
    stock_redeemed INTEGER DEFAULT 0,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX IF NOT EXISTS idx_campaign_exchange_prizes_campaign_id ON campaign_exchange_prizes(campaign_id);

COMMENT ON TABLE campaign_exchange_prizes IS 'Tabela para armazenar prémios de campanhas de troca (CR Nº 3)';











