-- ============================================================
-- Migration 002: Modulo de Areas
-- Tabelas: areas e relacionamento usuarios_areas
-- ============================================================


-- ------------------------------------------------------------
-- Tabela: areas
-- Representa as areas operacionais do atendimento
-- Ex: Suporte, Financeiro, Comercial
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS areas (
    id                      SERIAL PRIMARY KEY,
    nome                    VARCHAR(120) NOT NULL UNIQUE,
    descricao               TEXT,
    responsavel_usuario_id  INTEGER REFERENCES usuarios (id) ON DELETE SET NULL,
    ativo                   BOOLEAN NOT NULL DEFAULT TRUE,
    created_at              TIMESTAMP NOT NULL DEFAULT NOW(),
    updated_at              TIMESTAMP NOT NULL DEFAULT NOW()
);

CREATE INDEX IF NOT EXISTS idx_areas_nome ON areas (nome);
CREATE INDEX IF NOT EXISTS idx_areas_responsavel ON areas (responsavel_usuario_id);
CREATE INDEX IF NOT EXISTS idx_areas_ativo ON areas (ativo);


-- ------------------------------------------------------------
-- Tabela: usuarios_areas
-- Relacionamento muitos-para-muitos entre usuarios e areas
-- Um usuario pode atuar em mais de uma area e uma area pode ter
-- varios usuarios.
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS usuarios_areas (
    id            SERIAL PRIMARY KEY,
    usuario_id    INTEGER NOT NULL REFERENCES usuarios (id) ON DELETE CASCADE,
    area_id       INTEGER NOT NULL REFERENCES areas (id) ON DELETE CASCADE,
    funcao        VARCHAR(80),
    principal     BOOLEAN NOT NULL DEFAULT FALSE,
    ativo         BOOLEAN NOT NULL DEFAULT TRUE,
    created_at    TIMESTAMP NOT NULL DEFAULT NOW(),
    updated_at    TIMESTAMP NOT NULL DEFAULT NOW(),

    CONSTRAINT uq_usuario_area UNIQUE (usuario_id, area_id)
);

CREATE INDEX IF NOT EXISTS idx_usuarios_areas_usuario ON usuarios_areas (usuario_id);
CREATE INDEX IF NOT EXISTS idx_usuarios_areas_area ON usuarios_areas (area_id);
CREATE INDEX IF NOT EXISTS idx_usuarios_areas_ativo ON usuarios_areas (ativo);

-- Garante que cada usuario tenha no maximo uma area principal.
CREATE UNIQUE INDEX IF NOT EXISTS uq_usuario_area_principal
    ON usuarios_areas (usuario_id)
    WHERE principal = TRUE;


-- ------------------------------------------------------------
-- Dados iniciais: areas padrao para o MVP
-- ------------------------------------------------------------
INSERT INTO areas (nome, descricao) VALUES
    ('Suporte', 'Atendimento operacional e resolucao de duvidas tecnicas'),
    ('Financeiro', 'Atendimento relacionado a cobrancas, pagamentos e notas'),
    ('Comercial', 'Atendimento de vendas, propostas e relacionamento comercial')
ON CONFLICT (nome) DO NOTHING;
