-- Operações mínimas do controle de estoque para contas existentes.
-- A chave única (id_conta, codigo) mantém a execução idempotente.


-- Corrige operações legadas de devolução classificadas como compra/venda comum.
UPDATE operacoes
SET finalidade = CASE
        WHEN direcao = 'ENTRADA' THEN 'DEVOLUCAO_VENDA'
        WHEN direcao = 'SAIDA' THEN 'DEVOLUCAO_COMPRA'
        ELSE finalidade
    END,
    exige_fornecedor = CASE WHEN direcao = 'SAIDA' THEN 'S' ELSE 'N' END,
    exige_cliente = CASE WHEN direcao = 'ENTRADA' THEN 'S' ELSE 'N' END
WHERE UPPER(descricao) LIKE '%DEVOLU%'
  AND finalidade IN ('COMPRA', 'VENDA', 'OUTRA');

INSERT INTO operacoes (
    id_conta, codigo, descricao, padrao, mov_estoque, tipo_movimentacao,
    finalidade, movimenta_estoque, direcao, atualiza_custo,
    permite_estoque_negativo, exige_fornecedor, exige_cliente,
    tipo, natureza_operacao, status, deletado
)
SELECT
    c.id, modelo.codigo, modelo.descricao, 'N', modelo.mov_estoque, modelo.direcao,
    modelo.finalidade, 'S', modelo.direcao, modelo.atualiza_custo,
    'N', modelo.exige_fornecedor, modelo.exige_cliente,
    modelo.tipo, modelo.natureza, 'A', 'N'
FROM contas_usuarios c
JOIN (
    SELECT 'SALDO_INICIAL' AS codigo, 'Saldo inicial' AS descricao, 'E' AS mov_estoque,
           'ENTRADA' AS direcao, 'AJUSTE' AS finalidade, 'S' AS atualiza_custo,
           'N' AS exige_fornecedor, 'N' AS exige_cliente, 'D' AS tipo, 'E' AS natureza
    UNION ALL
    SELECT 'DEVOLUCAO_VENDA', 'Devolução de venda', 'E', 'ENTRADA',
           'DEVOLUCAO_VENDA', 'S', 'N', 'S', 'D', 'D'
    UNION ALL
    SELECT 'DEVOLUCAO_COMPRA', 'Devolução de compra', 'S', 'SAIDA',
           'DEVOLUCAO_COMPRA', 'N', 'S', 'N', 'R', 'D'
    UNION ALL
    SELECT 'AJUSTE_POSITIVO', 'Ajuste positivo de estoque', 'E', 'ENTRADA',
           'AJUSTE', 'S', 'N', 'N', 'D', 'E'
    UNION ALL
    SELECT 'AJUSTE_NEGATIVO', 'Ajuste negativo de estoque', 'S', 'SAIDA',
           'AJUSTE', 'N', 'N', 'N', 'R', 'E'
) modelo
LEFT JOIN operacoes existente
       ON existente.id_conta = c.id AND existente.codigo = modelo.codigo
WHERE existente.id IS NULL;

UPDATE operacoes origem
JOIN operacoes inversa
  ON inversa.id_conta = origem.id_conta
 AND inversa.codigo = CASE origem.codigo
        WHEN 'DEVOLUCAO_VENDA' THEN 'DEVOLUCAO_COMPRA'
        WHEN 'DEVOLUCAO_COMPRA' THEN 'DEVOLUCAO_VENDA'
        WHEN 'AJUSTE_POSITIVO' THEN 'AJUSTE_NEGATIVO'
        WHEN 'AJUSTE_NEGATIVO' THEN 'AJUSTE_POSITIVO'
    END
SET origem.id_operacao_inversa = inversa.id
WHERE origem.codigo IN ('DEVOLUCAO_VENDA', 'DEVOLUCAO_COMPRA', 'AJUSTE_POSITIVO', 'AJUSTE_NEGATIVO');

-- Padroniza também a descrição quando a operação já existia.
UPDATE operacoes
SET descricao = CASE codigo
        WHEN 'SALDO_INICIAL' THEN 'Saldo inicial'
        WHEN 'DEVOLUCAO_VENDA' THEN 'Devolução de venda'
        WHEN 'DEVOLUCAO_COMPRA' THEN 'Devolução de compra'
        WHEN 'AJUSTE_POSITIVO' THEN 'Ajuste positivo de estoque'
        WHEN 'AJUSTE_NEGATIVO' THEN 'Ajuste negativo de estoque'
        ELSE descricao
    END
WHERE codigo IN ('SALDO_INICIAL', 'DEVOLUCAO_VENDA', 'DEVOLUCAO_COMPRA', 'AJUSTE_POSITIVO', 'AJUSTE_NEGATIVO');
