# Leva a chave nova `admin.romaneio` para os perfis de sistema JÁ SALVOS.
#
# Por que existe (mesma armadilha de 20260826000005): 20260826000003 é idempotente,
# então uma permissão acrescentada ao catálogo DEPOIS daquele deploy nunca chega às
# linhas de perfis_acesso. O sintoma é mudo — o item some do menu e a URL responde
# "sem permissão" sem nada explicando o porquê.
#
# Diferença deliberada para 20260826000005: aqui é ADITIVO (`permissoes || '[...]'`)
# em vez de reescrever a lista inteira. Reescrever é aceitável para o Administrador
# ("acesso total" por definição); para o Gerente desfaria qualquer ajuste que o ADM
# tenha feito na tela de Perfis.
#
# Gerente entra porque `admin.romaneio` é a mesma classe de ferramenta operacional
# que `admin.planilha_simpli_route`, que ele já tem. Operador NÃO entra por padrão —
# quem carrega o caminhão recebe a chave pela tela de Perfis, que existe para isso.
class AddPermissaoRomaneioAosPerfis < ActiveRecord::Migration[7.1]
  CHAVE = 'admin.romaneio'.freeze

  def up
    return unless table_exists?(:perfis_acesso)

    execute(<<~SQL.squish)
      UPDATE perfis_acesso
         SET permissoes = permissoes || #{quote([CHAVE].to_json)}::jsonb,
             updated_at = NOW()
       WHERE sistema = true
         AND LOWER(nome) IN ('administrador', 'gerente')
         AND NOT (permissoes ? #{quote(CHAVE)})
    SQL
  end

  # Reversível: tirar a chave devolve os perfis ao estado anterior sem tocar em
  # mais nada (o `-` de jsonb remove o elemento do array, se estiver lá).
  def down
    return unless table_exists?(:perfis_acesso)

    execute(<<~SQL.squish)
      UPDATE perfis_acesso
         SET permissoes = permissoes - #{quote(CHAVE)}, updated_at = NOW()
       WHERE permissoes ? #{quote(CHAVE)}
    SQL
  end
end
