CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

CREATE TABLE IF NOT EXISTS usuarios (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    email VARCHAR(255) UNIQUE NOT NULL,
    senha_hash VARCHAR(255) NOT NULL,
    role VARCHAR(50) NOT NULL DEFAULT 'profissional',
    ativo BOOLEAN NOT NULL DEFAULT FALSE,
    criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    atualizado_em TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

CREATE TABLE IF NOT EXISTS funcoes_profissionais (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    nome VARCHAR(50) UNIQUE NOT NULL,
    criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    atualizado_em TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

INSERT INTO funcoes_profissionais (nome) VALUES 
('Fotógrafo'), 
('Cinegrafista'), 
('Recepcionista'), 
('Fixo Photum'), 
('Controle')
ON CONFLICT (nome) DO NOTHING;

CREATE TABLE IF NOT EXISTS cadastro_profissionais (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    usuario_id UUID REFERENCES usuarios(id) ON DELETE SET NULL,
    nome VARCHAR(255) NOT NULL,
    funcao_profissional_id UUID REFERENCES funcoes_profissionais(id) ON DELETE SET NULL,
    endereco VARCHAR(255),
    cidade VARCHAR(100),
    uf CHAR(2),
    whatsapp VARCHAR(20),
    cpf_cnpj_titular VARCHAR(20),
    banco VARCHAR(100),
    agencia VARCHAR(20),
    conta_pix VARCHAR(120),
    carro_disponivel BOOLEAN DEFAULT FALSE,
    tem_estudio BOOLEAN DEFAULT FALSE,
    qtd_estudio INT,
    tipo_cartao VARCHAR(50),
    observacao TEXT,
    qual_tec INT,
    educacao_simpatia INT,
    desempenho_evento INT,
    disp_horario INT,
    media NUMERIC(3,2),
    tabela_free VARCHAR(50),
    extra_por_equipamento BOOLEAN DEFAULT FALSE,
    equipamentos TEXT,
    criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    atualizado_em TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

CREATE TABLE IF NOT EXISTS refresh_tokens (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    usuario_id UUID NOT NULL REFERENCES usuarios(id) ON DELETE CASCADE,
    token_hash VARCHAR(255) NOT NULL,
    user_agent VARCHAR(255),
    ip VARCHAR(45),
    expira_em TIMESTAMPTZ NOT NULL,
    revogado BOOLEAN NOT NULL DEFAULT FALSE,
    criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

-- Cursos Table
CREATE TABLE IF NOT EXISTS cursos (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    nome VARCHAR(100) UNIQUE NOT NULL,
    criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

INSERT INTO cursos (nome) VALUES 
('Administração Empresas'), ('Agronomia'), ('Arquitetura / Urbanismo'), ('Biomedicina'), ('Comunicação'), ('Contábeis'), 
('Direito'), ('Economia'), ('Educação Física'), ('EFI I/EFI II'), ('EI/EFI'), ('EF II/EM'), ('EFI(5º ano)'), ('EFII'), 
('EI'), ('EM'), ('EM / TEC'), ('Enfermagem'), ('Eng. Ambiental'), ('Eng. Elétrica'), ('Engenharia'), ('Estética'), 
('Farmácia'), ('Fisioterapia'), ('Gastronomia'), ('Historia'), ('Jornalismo'), ('Med. Veterinária'), ('Medicina'), 
('Nutrição'), ('Odontologia'), ('Outro'), ('Pedagogia'), ('Publicidade'), ('Superior Diversos'), ('Tec. Diversos'), 
('Termomecânica'), ('Unificados'), ('Tec. Enfermagem'), ('Quimica'), ('EFI / EF II / EM'), ('Psicologia'), 
('Terapia Ocupacinal'), ('R.I')
ON CONFLICT (nome) DO NOTHING;

-- Empresas Table
CREATE TABLE IF NOT EXISTS empresas (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    nome VARCHAR(100) UNIQUE NOT NULL,
    criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

INSERT INTO empresas (nome) VALUES 
('Arte Formaturas'), ('JR Formaturas'), ('Perfil'), ('Photum'), ('Populi Formaturas'), ('Prime'), ('Smart'), ('Viva SP'), 
('Antares'), ('Forcamp'), ('PNI'), ('Fábio Ribeiro'), ('Told - B2_(CAMPINAS)'), ('Told - B2_(RECIFE)'), 
('NOVO - Told - B2_(SP)'), ('NOVO - Told - RUB_(SP)'), ('NOVO - TOLD'), ('Alpha Digital'), ('Golden'), ('Festa da Beca'), 
('Ponta Eventos'), ('Toy SP'), ('MVP Formaturas'), ('RUB')
ON CONFLICT (nome) DO NOTHING;

-- Anos Formaturas Table
CREATE TABLE IF NOT EXISTS anos_formaturas (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    ano_semestre VARCHAR(20) UNIQUE NOT NULL, -- Ex: 2019.2
    criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

INSERT INTO anos_formaturas (ano_semestre) VALUES 
('2019.2'), ('2020.1'), ('2020.2'), ('2021.1'), ('2021.2'), ('2022.1'), ('2022.2'), ('2023.1'), ('2023.2'), 
('2024.1'), ('2024.2'), ('2025.1'), ('2025.2'), ('2026.1'), ('2026.2'), ('2027.1'), ('2027.2'), ('2028.1'), 
('2028.2'), ('2029.1'), ('2029.2')
ON CONFLICT (ano_semestre) DO NOTHING;

-- Tipos Servicos Table
CREATE TABLE IF NOT EXISTS tipos_servicos (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    nome VARCHAR(50) UNIQUE NOT NULL,
    criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

INSERT INTO tipos_servicos (nome) VALUES 
('Fotógrafo'), ('Recepcionista'), ('Cinegrafista'), ('Coordenação'), ('Ponto de Foto'), ('Ponto de ID'), ('Estúdio'), 
('Outro'), ('Controle')
ON CONFLICT (nome) DO NOTHING;

-- Tipos Eventos Table
CREATE TABLE IF NOT EXISTS tipos_eventos (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    nome VARCHAR(100) UNIQUE NOT NULL,
    criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

INSERT INTO tipos_eventos (nome) VALUES 
('Identificação'), ('Baile'), ('Colação'), ('Col/Baile (mesmo local)'), ('Col/Baile (local diferente)'), ('Missa / Culto'), 
('Churrasco'), ('Trote'), ('Outro'), ('Balada'), ('Jantar'), ('Festa Junina'), ('Colação Oficial'), ('Family Day'), 
('Refeição'), ('Estudio ID e Family Day'), ('Estudio Colação / Baile')
ON CONFLICT (nome) DO NOTHING;

-- Precos Tipos Eventos Table (Junction Table for Pricing)
CREATE TABLE IF NOT EXISTS precos_tipos_eventos (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    tipo_evento_id UUID REFERENCES tipos_eventos(id) ON DELETE CASCADE,
    funcao_profissional_id UUID REFERENCES funcoes_profissionais(id) ON DELETE CASCADE,
    valor NUMERIC(10,2) NOT NULL DEFAULT 0.00,
    criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    UNIQUE(tipo_evento_id, funcao_profissional_id)
);

-- Cadastro FOT
CREATE TABLE IF NOT EXISTS cadastro_fot (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    fot INTEGER NOT NULL UNIQUE,
    empresa_id UUID NOT NULL REFERENCES empresas(id),
    curso_id UUID NOT NULL REFERENCES cursos(id),
    ano_formatura_id UUID NOT NULL REFERENCES anos_formaturas(id),
    instituicao VARCHAR(255),
    cidade VARCHAR(255),
    estado VARCHAR(2),
    observacoes TEXT,
    gastos_captacao NUMERIC(10, 2),
    pre_venda BOOLEAN,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

-- Seed Pricing Data
DO $$
DECLARE
    -- IDs for Functions
    id_foto UUID;
    id_cine UUID;
    id_recep UUID;
    
    -- IDs for Events
    id_identificacao UUID;
    id_baile UUID;
    id_colacao UUID;
    id_col_baile_mesmo UUID;
    id_col_baile_dif UUID;
    id_missa UUID;
    id_churrasco UUID;
    id_trote UUID;
    id_outro UUID;
    id_balada UUID;
    id_jantar UUID;
    id_festa_junina UUID;
    id_colacao_oficial UUID;
    id_family_day UUID;
    id_refeicao UUID;
    id_estudio_id UUID;
    id_estudio_col UUID;
BEGIN
    -- Fetch Function IDs
    SELECT id INTO id_foto FROM funcoes_profissionais WHERE nome = 'Fotógrafo';
    SELECT id INTO id_cine FROM funcoes_profissionais WHERE nome = 'Cinegrafista';
    SELECT id INTO id_recep FROM funcoes_profissionais WHERE nome = 'Recepcionista';

    -- Fetch Event IDs
    SELECT id INTO id_identificacao FROM tipos_eventos WHERE nome = 'Identificação';
    SELECT id INTO id_baile FROM tipos_eventos WHERE nome = 'Baile';
    SELECT id INTO id_colacao FROM tipos_eventos WHERE nome = 'Colação';
    SELECT id INTO id_col_baile_mesmo FROM tipos_eventos WHERE nome = 'Col/Baile (mesmo local)';
    SELECT id INTO id_col_baile_dif FROM tipos_eventos WHERE nome = 'Col/Baile (local diferente)';
    SELECT id INTO id_missa FROM tipos_eventos WHERE nome = 'Missa / Culto';
    SELECT id INTO id_churrasco FROM tipos_eventos WHERE nome = 'Churrasco';
    SELECT id INTO id_trote FROM tipos_eventos WHERE nome = 'Trote';
    SELECT id INTO id_outro FROM tipos_eventos WHERE nome = 'Outro';
    SELECT id INTO id_balada FROM tipos_eventos WHERE nome = 'Balada';
    SELECT id INTO id_jantar FROM tipos_eventos WHERE nome = 'Jantar';
    SELECT id INTO id_festa_junina FROM tipos_eventos WHERE nome = 'Festa Junina';
    SELECT id INTO id_colacao_oficial FROM tipos_eventos WHERE nome = 'Colação Oficial';
    SELECT id INTO id_family_day FROM tipos_eventos WHERE nome = 'Family Day';
    SELECT id INTO id_refeicao FROM tipos_eventos WHERE nome = 'Refeição';
    SELECT id INTO id_estudio_id FROM tipos_eventos WHERE nome = 'Estudio ID e Family Day';
    SELECT id INTO id_estudio_col FROM tipos_eventos WHERE nome = 'Estudio Colação / Baile';

    -- Helper temp table for inserts to keep code clean? No, direct inserts are clearer.
    
    -- Identificação: Rec 90, Foto 160
    INSERT INTO precos_tipos_eventos (tipo_evento_id, funcao_profissional_id, valor) VALUES
    (id_identificacao, id_recep, 90.00), (id_identificacao, id_foto, 160.00)
    ON CONFLICT (tipo_evento_id, funcao_profissional_id) DO UPDATE SET valor = EXCLUDED.valor;

    -- Baile: Rec 115, Cin 450, Foto 310
    INSERT INTO precos_tipos_eventos (tipo_evento_id, funcao_profissional_id, valor) VALUES
    (id_baile, id_recep, 115.00), (id_baile, id_cine, 450.00), (id_baile, id_foto, 310.00)
    ON CONFLICT (tipo_evento_id, funcao_profissional_id) DO UPDATE SET valor = EXCLUDED.valor;

    -- Colação: Rec 115, Cin 450, Foto 280
    INSERT INTO precos_tipos_eventos (tipo_evento_id, funcao_profissional_id, valor) VALUES
    (id_colacao, id_recep, 115.00), (id_colacao, id_cine, 450.00), (id_colacao, id_foto, 280.00)
    ON CONFLICT (tipo_evento_id, funcao_profissional_id) DO UPDATE SET valor = EXCLUDED.valor;

    -- Col/Baile (mesmo local): Rec 140, Cin 510, Foto 350
    INSERT INTO precos_tipos_eventos (tipo_evento_id, funcao_profissional_id, valor) VALUES
    (id_col_baile_mesmo, id_recep, 140.00), (id_col_baile_mesmo, id_cine, 510.00), (id_col_baile_mesmo, id_foto, 350.00)
    ON CONFLICT (tipo_evento_id, funcao_profissional_id) DO UPDATE SET valor = EXCLUDED.valor;

    -- Col/Baile (local diferente): Rec 150, Cin 610, Foto 390
    INSERT INTO precos_tipos_eventos (tipo_evento_id, funcao_profissional_id, valor) VALUES
    (id_col_baile_dif, id_recep, 150.00), (id_col_baile_dif, id_cine, 610.00), (id_col_baile_dif, id_foto, 390.00)
    ON CONFLICT (tipo_evento_id, funcao_profissional_id) DO UPDATE SET valor = EXCLUDED.valor;

    -- Missa / Culto: Rec 115, Cin 440, Foto 230
    INSERT INTO precos_tipos_eventos (tipo_evento_id, funcao_profissional_id, valor) VALUES
    (id_missa, id_recep, 115.00), (id_missa, id_cine, 440.00), (id_missa, id_foto, 230.00)
    ON CONFLICT (tipo_evento_id, funcao_profissional_id) DO UPDATE SET valor = EXCLUDED.valor;

    -- Churrasco: Rec 90, Cin 440, Foto 250
    INSERT INTO precos_tipos_eventos (tipo_evento_id, funcao_profissional_id, valor) VALUES
    (id_churrasco, id_recep, 90.00), (id_churrasco, id_cine, 440.00), (id_churrasco, id_foto, 250.00)
    ON CONFLICT (tipo_evento_id, funcao_profissional_id) DO UPDATE SET valor = EXCLUDED.valor;

    -- Trote: Rec 70, Foto 100
    INSERT INTO precos_tipos_eventos (tipo_evento_id, funcao_profissional_id, valor) VALUES
    (id_trote, id_recep, 70.00), (id_trote, id_foto, 100.00)
    ON CONFLICT (tipo_evento_id, funcao_profissional_id) DO UPDATE SET valor = EXCLUDED.valor;

    -- Outro: Foto 250
    INSERT INTO precos_tipos_eventos (tipo_evento_id, funcao_profissional_id, valor) VALUES
    (id_outro, id_foto, 250.00)
    ON CONFLICT (tipo_evento_id, funcao_profissional_id) DO UPDATE SET valor = EXCLUDED.valor;

    -- Balada: Rec 115, Cin 440, Foto 250
    INSERT INTO precos_tipos_eventos (tipo_evento_id, funcao_profissional_id, valor) VALUES
    (id_balada, id_recep, 115.00), (id_balada, id_cine, 440.00), (id_balada, id_foto, 250.00)
    ON CONFLICT (tipo_evento_id, funcao_profissional_id) DO UPDATE SET valor = EXCLUDED.valor;

    -- Jantar: Rec 115, Cin 440, Foto 310
    INSERT INTO precos_tipos_eventos (tipo_evento_id, funcao_profissional_id, valor) VALUES
    (id_jantar, id_recep, 115.00), (id_jantar, id_cine, 440.00), (id_jantar, id_foto, 310.00)
    ON CONFLICT (tipo_evento_id, funcao_profissional_id) DO UPDATE SET valor = EXCLUDED.valor;

    -- Festa Junina: Foto 200
    INSERT INTO precos_tipos_eventos (tipo_evento_id, funcao_profissional_id, valor) VALUES
    (id_festa_junina, id_foto, 200.00)
    ON CONFLICT (tipo_evento_id, funcao_profissional_id) DO UPDATE SET valor = EXCLUDED.valor;

    -- Colação Oficial: Rec 115, Cin 450, Foto 280
    INSERT INTO precos_tipos_eventos (tipo_evento_id, funcao_profissional_id, valor) VALUES
    (id_colacao_oficial, id_recep, 115.00), (id_colacao_oficial, id_cine, 450.00), (id_colacao_oficial, id_foto, 280.00)
    ON CONFLICT (tipo_evento_id, funcao_profissional_id) DO UPDATE SET valor = EXCLUDED.valor;

    -- Family Day: Rec 210, Cin 670, Foto 490
    INSERT INTO precos_tipos_eventos (tipo_evento_id, funcao_profissional_id, valor) VALUES
    (id_family_day, id_recep, 210.00), (id_family_day, id_cine, 670.00), (id_family_day, id_foto, 490.00)
    ON CONFLICT (tipo_evento_id, funcao_profissional_id) DO UPDATE SET valor = EXCLUDED.valor;

    -- Refeição: Rec 35 (Assuming Rec column corresponds to Refeição cost based on position, or just mapping single value)
    INSERT INTO precos_tipos_eventos (tipo_evento_id, funcao_profissional_id, valor) VALUES
    (id_refeicao, id_recep, 35.00)
    ON CONFLICT (tipo_evento_id, funcao_profissional_id) DO UPDATE SET valor = EXCLUDED.valor;

    -- Estudio ID e Family Day: Rec 80
    INSERT INTO precos_tipos_eventos (tipo_evento_id, funcao_profissional_id, valor) VALUES
    (id_estudio_id, id_recep, 80.00)
    ON CONFLICT (tipo_evento_id, funcao_profissional_id) DO UPDATE SET valor = EXCLUDED.valor;

    -- Estudio Colação / Baile: Rec 50
    INSERT INTO precos_tipos_eventos (tipo_evento_id, funcao_profissional_id, valor) VALUES
    (id_estudio_col, id_recep, 50.00)
    ON CONFLICT (tipo_evento_id, funcao_profissional_id) DO UPDATE SET valor = EXCLUDED.valor;

END $$;

-- Cadastro Clientes (Representatives of Companies)
CREATE TABLE IF NOT EXISTS cadastro_clientes (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    usuario_id UUID REFERENCES usuarios(id) ON DELETE CASCADE,
    empresa_id UUID REFERENCES empresas(id) ON DELETE SET NULL,
    nome VARCHAR(255), -- Name of the representative
    telefone VARCHAR(20),
    criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    atualizado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    UNIQUE(usuario_id)
);
-- Agenda Table
CREATE TABLE IF NOT EXISTS agenda (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    user_id UUID REFERENCES usuarios(id) ON DELETE CASCADE, -- User who created the event (Client/Owner)
    fot_id UUID NOT NULL REFERENCES cadastro_fot(id) ON DELETE CASCADE,
    data_evento DATE NOT NULL,
    tipo_evento_id UUID NOT NULL REFERENCES tipos_eventos(id),
    observacoes_evento TEXT,
    local_evento VARCHAR(255),
    endereco VARCHAR(255),
    horario VARCHAR(20),
    qtd_formandos INTEGER DEFAULT 0,
    qtd_fotografos INTEGER DEFAULT 0,
    qtd_recepcionistas INTEGER DEFAULT 0,
    qtd_cinegrafistas INTEGER DEFAULT 0,
    qtd_estudios INTEGER DEFAULT 0,
    qtd_ponto_foto INTEGER DEFAULT 0,
    qtd_ponto_id INTEGER DEFAULT 0,
    qtd_ponto_decorado INTEGER DEFAULT 0,
    qtd_pontos_led INTEGER DEFAULT 0,
    qtd_plataforma_360 INTEGER DEFAULT 0,
    status_profissionais VARCHAR(20) DEFAULT 'OK', -- OK, FALTA, ERRO
    foto_faltante INTEGER DEFAULT 0,
    recep_faltante INTEGER DEFAULT 0,
    cine_faltante INTEGER DEFAULT 0,
    logistica_observacoes TEXT,
    pre_venda BOOLEAN DEFAULT FALSE,
    criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    atualizado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    status VARCHAR(50) DEFAULT 'Pendente' -- Pendente, Aprovado, Arquivado
);

CREATE TABLE IF NOT EXISTS agenda_profissionais (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    agenda_id UUID NOT NULL REFERENCES agenda(id) ON DELETE CASCADE,
    profissional_id UUID NOT NULL REFERENCES cadastro_profissionais(id) ON DELETE CASCADE,
    status VARCHAR(20) DEFAULT 'PENDENTE', -- PENDENTE, ACEITO, REJEITADO
    motivo_rejeicao TEXT,
    criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    UNIQUE(agenda_id, profissional_id)
);
