-- +goose Up
-- +goose StatementBegin

-- ─────────────────────────────────────────────────────────────────────────────
-- Ocorrências do espelho de ponto: falta injustificada, saída antecipada,
-- não retorno do intervalo, e ações disciplinares (advertência verbal/
-- escrita, suspensão). Substitui o desconto automático de falta no holerite
-- — agora o desconto só ocorre quando o RH confirma uma ação disciplinar
-- com efeito financeiro sobre uma ocorrência registrada aqui.
-- ─────────────────────────────────────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS ocorrencias (
    id              UUID         PRIMARY KEY DEFAULT uuid_generate_v4(),
    tenant_id       UUID         NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
    funcionario_id  UUID         NOT NULL REFERENCES users(id)   ON DELETE CASCADE,
    data            DATE         NOT NULL,
    tipo            TEXT         NOT NULL
                                  CHECK (tipo IN (
                                      'falta_injustificada','saida_antecipada',
                                      'nao_retorno_intervalo','atraso_recorrente','outros'
                                  )),
    descricao       TEXT         NOT NULL DEFAULT '', -- detalhe da detecção (ex: "saiu 16:30, esperado 18:00")
    origem          TEXT         NOT NULL DEFAULT 'manual'
                                  CHECK (origem IN ('automatica','manual')),
    status          TEXT         NOT NULL DEFAULT 'pendente'
                                  CHECK (status IN ('pendente','resolvida','cancelada')),

    -- Ação disciplinar aplicada pelo RH (pode ser nula enquanto pendente)
    acao            TEXT         CHECK (acao IN (
                                      'apenas_registrar','advertencia_verbal',
                                      'advertencia_escrita','suspensao','desconto_folha'
                                  )),
    dias_suspensao  INT,         -- usado quando acao='suspensao' (dias sem trabalhar/sem remuneração)
    observacao_acao TEXT         NOT NULL DEFAULT '',

    -- Vínculo com o desconto gerado no holerite, quando a ação tiver
    -- efeito financeiro (desconto_folha, ou suspensao com desconto dos dias)
    lancamento_id   UUID         REFERENCES holerite_lancamentos(id) ON DELETE SET NULL,
    mes_referencia  TEXT,        -- 'YYYY-MM' — mês em que o desconto é aplicado

    criado_por      UUID         REFERENCES users(id) ON DELETE SET NULL,
    resolvido_por   UUID         REFERENCES users(id) ON DELETE SET NULL,
    criado_em       TIMESTAMPTZ  NOT NULL DEFAULT now(),
    resolvido_em    TIMESTAMPTZ,

    -- Evita duplicar a mesma ocorrência automática (ex: a mesma falta do
    -- mesmo dia sendo gerada de novo a cada vez que o holerite é calculado)
    UNIQUE (tenant_id, funcionario_id, data, tipo)
);

CREATE INDEX IF NOT EXISTS idx_ocorrencias_tenant_func
    ON ocorrencias (tenant_id, funcionario_id, data);

CREATE INDEX IF NOT EXISTS idx_ocorrencias_status
    ON ocorrencias (tenant_id, status);

-- +goose StatementEnd

-- +goose Down
-- +goose StatementBegin
DROP TABLE IF EXISTS ocorrencias;
-- +goose StatementEnd
