# app/controllers/admin/variaveis_personalizadas_controller.rb
#
# CRUD das {{variaveis}} que o ADM cria. Uma vez cadastradas, aparecem no editor
# de mensagem ao lado das variáveis do sistema e valem para qualquer evento.
module Admin
  class VariaveisPersonalizadasController < ApplicationController
    include Auditavel

    before_action :set_variavel, only: %i[edit update destroy]

    def index
      authorize VariavelPersonalizada
      @variaveis = policy_scope(VariavelPersonalizada).ordenadas
      # Mostrar o catálogo do sistema junto evita o erro mais comum: cadastrar
      # {{data}} sem saber que já existe (o model recusa, mas melhor avisar antes).
      @do_sistema = Notificacao::CatalogoVariaveis.por_origem.except(:personalizada)
    end

    def new
      @variavel = VariavelPersonalizada.new(ativo: true)
      authorize @variavel
    end

    def create
      @variavel = VariavelPersonalizada.new(variavel_params)
      authorize @variavel

      if @variavel.save
        auditar!(:criar, @variavel, dados_novos: { chave: @variavel.chave, valor: @variavel.valor })
        redirect_to admin_variaveis_path, notice: "Variável #{@variavel.marcador} criada."
      else
        render :new, status: :unprocessable_entity
      end
    end

    def edit; end

    def update
      anterior = @variavel.valor

      if @variavel.update(variavel_params)
        auditar!(:editar, @variavel,
                 dados_anteriores: { valor: anterior },
                 dados_novos:      { valor: @variavel.valor })
        redirect_to admin_variaveis_path, notice: "Variável #{@variavel.marcador} atualizada."
      else
        render :edit, status: :unprocessable_entity
      end
    end

    def destroy
      marcador = @variavel.marcador
      @variavel.destroy
      auditar!(:excluir, @variavel, dados_anteriores: { chave: @variavel.chave })

      # A variável some, mas o texto que a usava continua lá: sem valor, o
      # renderizador troca por vazio. Avisar é melhor do que a mensagem sair com
      # um buraco que ninguém relaciona a esta exclusão.
      redirect_to admin_variaveis_path,
                  alert: "Variável #{marcador} excluída. Mensagens que a usavam passam a mostrar espaço em branco no lugar."
    end

    private

    def set_variavel
      @variavel = VariavelPersonalizada.find(params[:id])
      authorize @variavel
    end

    def variavel_params
      params.require(:variavel_personalizada).permit(:chave, :valor, :descricao, :ativo)
    end
  end
end
