-- ============================================================
-- ADICIONAR SCHEDULE/AGENDAMENTO NA INTEGRAÇÃO
-- ============================================================

-- Adicionar colunas de agendamento
ALTER TABLE back.integracao_erp 
ADD COLUMN IF NOT EXISTS schedule_cron VARCHAR(50),
ADD COLUMN IF NOT EXISTS schedule_ativo BOOLEAN DEFAULT false,
ADD COLUMN IF NOT EXISTS ultima_sincronizacao TIMESTAMP,
ADD COLUMN IF NOT EXISTS proxima_sincronizacao TIMESTAMP;

-- Comentários
COMMENT ON COLUMN back.integracao_erp.schedule_cron IS 'Expressão cron para agendamento (ex: "0 2 * * *" = 2h da manhã)';
COMMENT ON COLUMN back.integracao_erp.schedule_ativo IS 'Se o agendamento automático está ativo';
COMMENT ON COLUMN back.integracao_erp.ultima_sincronizacao IS 'Data/hora da última sincronização executada';
COMMENT ON COLUMN back.integracao_erp.proxima_sincronizacao IS 'Data/hora calculada da próxima sincronização';

-- Tabela de log de sincronizações
CREATE TABLE IF NOT EXISTS back.integracao_sincronizacao (
  cdsincronizacao SERIAL PRIMARY KEY,
  cdintegracao INT NOT NULL REFERENCES back.integracao_erp(cdintegracao) ON DELETE CASCADE,
  dtsinc_inicio TIMESTAMP NOT NULL DEFAULT NOW(),
  dtsinc_fim TIMESTAMP,
  qtd_origem INT DEFAULT 0,
  qtd_deletados INT DEFAULT 0,
  qtd_inseridos INT DEFAULT 0,
  qtd_erros INT DEFAULT 0,
  status VARCHAR(20) DEFAULT 'processando', -- processando|concluido|erro
  observacoes TEXT,
  -- Auditoria
  cdusername VARCHAR(100),
  dthcriacao TIMESTAMP DEFAULT NOW()
);

COMMENT ON TABLE back.integracao_sincronizacao IS 'Log resumido de cada execução de sincronização';
COMMENT ON COLUMN back.integracao_sincronizacao.status IS 'processando | concluido | erro';

-- Tabela de lock de execução (evita execuções concorrentes)
CREATE TABLE IF NOT EXISTS back.integracao_lock (
  cdintegracao INT PRIMARY KEY REFERENCES back.integracao_erp(cdintegracao) ON DELETE CASCADE,
  status VARCHAR(20) DEFAULT 'livre', -- livre|processando
  pid INT,
  dtsinc_inicio TIMESTAMP,
  observacoes TEXT
);

COMMENT ON TABLE back.integracao_lock IS 'Controle de lock para evitar sincronizações concorrentes do mesmo modelo';

-- Inserir locks para todos os modelos existentes
INSERT INTO back.integracao_lock (cdintegracao, status)
SELECT cdintegracao, 'livre'
FROM back.integracao_erp
WHERE fltipo = 'modelo'
ON CONFLICT (cdintegracao) DO NOTHING;

-- Índices
CREATE INDEX IF NOT EXISTS idx_integracao_sincronizacao_integ ON back.integracao_sincronizacao(cdintegracao);
CREATE INDEX IF NOT EXISTS idx_integracao_sincronizacao_status ON back.integracao_sincronizacao(status);
CREATE INDEX IF NOT EXISTS idx_integracao_sincronizacao_dt ON back.integracao_sincronizacao(dtsinc_inicio);
