-- ============================================================
-- TABELA GENÉRICA DE AUDITORIA E LOGS
-- ============================================================
-- Tabela curinga para registrar QUALQUER ação no sistema
-- Permite flexibilidade total: login, alterações, sincronizações, etc

CREATE TABLE IF NOT EXISTS back.auditoria_log (
    cdlog BIGSERIAL PRIMARY KEY,
    tipo_acao VARCHAR(50) NOT NULL,                     -- 'login', 'logout', 'alteracao', 'sincronizacao', etc
    cdpessoa INT REFERENCES back.pessoa(cdpessoa) ON DELETE SET NULL,
    cdempresa INT REFERENCES back.empresa(cdempresa) ON DELETE SET NULL,
    ip_address VARCHAR(45),                             -- IPv4 ou IPv6
    localizacao VARCHAR(255),                           -- cidade, país, ISP, etc (opcional)
    user_agent TEXT,                                    -- Browser/Client info
    resultado VARCHAR(20),                              -- 'sucesso', 'falha', 'aviso'
    descricao TEXT,                                     -- Descrição breve
    dados_json JSONB,                                   -- Dados flexíveis em JSON
    dthcriacao TIMESTAMP DEFAULT NOW(),
    dthmodificacao TIMESTAMP DEFAULT NOW()
);

-- Índices para performance
CREATE INDEX IF NOT EXISTS idx_auditoria_tipo ON back.auditoria_log(tipo_acao);
CREATE INDEX IF NOT EXISTS idx_auditoria_cdpessoa ON back.auditoria_log(cdpessoa);
CREATE INDEX IF NOT EXISTS idx_auditoria_cdempresa ON back.auditoria_log(cdempresa);
CREATE INDEX IF NOT EXISTS idx_auditoria_data ON back.auditoria_log(dthcriacao DESC);
CREATE INDEX IF NOT EXISTS idx_auditoria_ip ON back.auditoria_log(ip_address);

-- Comentários
COMMENT ON TABLE back.auditoria_log IS 'Tabela genérica para auditoria e logs de todas as ações do sistema';
COMMENT ON COLUMN back.auditoria_log.tipo_acao IS 'Tipo de ação: login, logout, alteracao_pessoa, alteracao_integracao, sincronizacao, erro, etc';
COMMENT ON COLUMN back.auditoria_log.dados_json IS 'Dados flexíveis em JSON - permite armazenar qualquer informação adicional';
COMMENT ON COLUMN back.auditoria_log.resultado IS 'sucesso, falha, aviso, bloqueado';
