-- ============================================================
-- TABELAS DE MAPEAMENTO E CONTEXTO PARA INTEGRAÇÃO ERP
-- ============================================================

/* ============================================================
 * CONTEXTO DE INTEGRAÇÃO
 * Define os campos de origem que servem como chaves para resolução
 * ============================================================ */
CREATE TABLE IF NOT EXISTS back.integracao_contexto (
  cdcontexto SERIAL PRIMARY KEY,
  cdintegracao INT NOT NULL REFERENCES back.integracao(cdintegracao) ON DELETE CASCADE,
  -- Campos de origem que identificam empresa e período
  campo_empresa_origem VARCHAR(255) NOT NULL,  -- Nome da coluna na origem que contém código da empresa
  campo_data_origem VARCHAR(255) NOT NULL,     -- Nome da coluna na origem que contém a data
  flativo BOOLEAN DEFAULT true,
  -- Auditoria
  cdusername_criacao VARCHAR(100),
  dthcriacao TIMESTAMP DEFAULT NOW(),
  cdusername_edicao VARCHAR(100),
  dthedicao TIMESTAMP,
  UNIQUE(cdintegracao)
);

COMMENT ON TABLE back.integracao_contexto IS 'Define os campos de origem necessários para resolver empresa e exercício em cada integração';
COMMENT ON COLUMN back.integracao_contexto.campo_empresa_origem IS 'Nome da coluna na origem que contém o código da empresa';
COMMENT ON COLUMN back.integracao_contexto.campo_data_origem IS 'Nome da coluna na origem que contém a data do lançamento';

/* ============================================================
 * MAPEAMENTO DE CAMPOS
 * Mapeia campos da origem para campos HELM
 * ============================================================ */
CREATE TABLE IF NOT EXISTS back.integracao_mapeamento (
  cdmapeamento SERIAL PRIMARY KEY,
  cdintegracao INT NOT NULL REFERENCES back.integracao(cdintegracao) ON DELETE CASCADE,
  
  -- Campo HELM destino
  nome_campo_helm VARCHAR(255) NOT NULL,
  
  -- Tipo de mapeamento
  tipo_mapeamento VARCHAR(20) NOT NULL DEFAULT 'direto',
  -- Tipos suportados:
  -- 'direto'     = copia valor da coluna origem
  -- 'constante'  = valor fixo definido pelo usuário
  -- 'expressao'  = usa expressão (ex: EXTRACT(MONTH FROM data))
  -- 'lookup'     = busca valor em outra tabela HELM
  -- 'json'       = serializa toda origem como JSON
  
  -- Campos de origem
  nome_campo_origem VARCHAR(255),           -- Para tipo 'direto'
  
  -- Valores
  valor_constante VARCHAR(1000),            -- Para tipo 'constante'
  expressao_sql TEXT,                       -- Para tipo 'expressao'
  
  -- Configuração de lookup (JSON)
  configuracao_json TEXT,                   -- Para tipo 'lookup', contém {tabela, coluna_pk, coluna_codigo, etc}
  
  -- Flags
  flobrigatorio BOOLEAN DEFAULT false,      -- Se campo é obrigatório
  flativo BOOLEAN DEFAULT true,
  
  -- Auditoria
  cdusername_criacao VARCHAR(100),
  dthcriacao TIMESTAMP DEFAULT NOW(),
  cdusername_edicao VARCHAR(100),
  dthedicao TIMESTAMP,
  
  UNIQUE(cdintegracao, nome_campo_helm)
);

COMMENT ON TABLE back.integracao_mapeamento IS 'Mapeia campos da origem ERP para campos HELM realizado';
COMMENT ON COLUMN back.integracao_mapeamento.tipo_mapeamento IS 'direto | constante | expressao | lookup | json';
COMMENT ON COLUMN back.integracao_mapeamento.flobrigatorio IS 'Se true, mapeador lança erro se campo vazio';

-- Índices
CREATE INDEX IF NOT EXISTS idx_integracao_mapeamento_integ ON back.integracao_mapeamento(cdintegracao);
CREATE INDEX IF NOT EXISTS idx_integracao_contexto_integ ON back.integracao_contexto(cdintegracao);
