-- +goose Up
-- +goose StatementBegin

-- 1. Corrigir UNIQUE de produto_estoque_grade para funcionar com cor_id NULL
--    PostgreSQL: NULL != NULL, então UNIQUE com nullable não funciona com ON CONFLICT
--    Solução: index parcial com COALESCE
ALTER TABLE produto_estoque_grade
  DROP CONSTRAINT IF EXISTS produto_estoque_grade_tenant_id_produto_id_cor_id_tamanho_key;

CREATE UNIQUE INDEX IF NOT EXISTS idx_grade_uniq_com_cor
  ON produto_estoque_grade (tenant_id, produto_id, cor_id, tamanho)
  WHERE cor_id IS NOT NULL;

CREATE UNIQUE INDEX IF NOT EXISTS idx_grade_uniq_sem_cor
  ON produto_estoque_grade (tenant_id, produto_id, tamanho)
  WHERE cor_id IS NULL;

-- 2. Garantir que movimentos_estoque tem todas as colunas esperadas
ALTER TABLE movimentos_estoque
  ADD COLUMN IF NOT EXISTS fornecedor   TEXT NOT NULL DEFAULT '',
  ADD COLUMN IF NOT EXISTS referencia   TEXT NOT NULL DEFAULT '',
  ADD COLUMN IF NOT EXISTS observacoes  TEXT NOT NULL DEFAULT '',
  ADD COLUMN IF NOT EXISTS usuario_id   UUID REFERENCES users(id) ON DELETE SET NULL,
  ADD COLUMN IF NOT EXISTS tamanho      TEXT NOT NULL DEFAULT '',
  ADD COLUMN IF NOT EXISTS preco_custo  NUMERIC(15,4) NOT NULL DEFAULT 0,
  ADD COLUMN IF NOT EXISTS cor_id       UUID REFERENCES estoque_categorias(id) ON DELETE SET NULL,
  ADD COLUMN IF NOT EXISTS origem       TEXT NOT NULL DEFAULT 'produto',
  ADD COLUMN IF NOT EXISTS motivo       TEXT NOT NULL DEFAULT '';

-- 3. quantidade_atual pode entrar como valor inicial no cadastro de materia-prima
--    (já existe, só garantindo o default)
ALTER TABLE produtos
  ALTER COLUMN quantidade_atual SET DEFAULT 0;

-- +goose StatementEnd

-- +goose Down
-- +goose StatementBegin
DROP INDEX IF EXISTS idx_grade_uniq_com_cor;
DROP INDEX IF EXISTS idx_grade_uniq_sem_cor;
ALTER TABLE produto_estoque_grade
  ADD CONSTRAINT produto_estoque_grade_tenant_id_produto_id_cor_id_tamanho_key
  UNIQUE (tenant_id, produto_id, cor_id, tamanho);
-- +goose StatementEnd
