# app/controllers/admin/mensagem_templates_controller.rb
#
# Editor de blocos: monta o corpo de UM evento em UM canal.
#
# O preview roda no SERVIDOR, chamando o mesmo Notificacao::Renderizador do
# envio. Uma segunda implementação em JavaScript ficaria mais rápida e
# inevitavelmente divergiria do que é enviado de verdade — e o preview existe
# justamente para prometer o contrário.
class Admin::MensagemTemplatesController < ApplicationController
  before_action :carregar

  def edit
    authorize @evento, :update?
  end

  def update
    authorize @evento, :update?

    @template.assign_attributes(atributos)
    if @template.save
      AuditoriaLog.registrar(user: current_user, acao: 'mensagem_template',
                             entidade: 'MensagemTemplate',
                             dados_novos: { detalhes: "Editou a mensagem de #{@evento.nome} (#{@canal})" },
                             request: request)
      redirect_to template_admin_evento_path(@evento, canal: @canal), notice: 'Mensagem salva.'
    else
      render :edit, status: :unprocessable_entity
    end
  end

  # Renderiza o que está NA TELA (ainda não salvo) com os valores de amostra.
  def preview
    authorize @evento, :update?

    provisorio = MensagemTemplate.new(evento_notificacao: @evento, canal: @canal,
                                      assunto: params[:assunto], blocos: blocos_do_form, ativo: true)
    provisorio.validate # dispara a limpeza dos blocos antes de renderizar

    dados = Notificacao::CatalogoVariaveis.amostra(@evento.gatilho)
    render json: { html: corpo_do_preview(provisorio, dados),
                   assunto: provisorio.renderizador(dados).interpolar(provisorio.assunto) }
  end

  private

  def carregar
    @evento = EventoNotificacao.find(params[:id])
    @canal  = MensagemTemplate::CANAIS.include?(params[:canal]) ? params[:canal] : 'whatsapp'
    @template = @evento.template(@canal)
    @variaveis = @evento.variaveis
  end

  def atributos
    { assunto: params[:assunto].to_s.strip,
      blocos: blocos_do_form,
      ativo: params[:ativo] == '1' }
  end

  # O editor serializa o estado num campo hidden. JSON inválido vira lista
  # vazia: salvar lixo seria pior do que salvar nada, e o model ainda descarta
  # bloco fora do catálogo.
  def blocos_do_form
    JSON.parse(params[:blocos].to_s)
  rescue JSON::ParserError
    []
  end

  # E-mail: HTML já montado e escapado pelo renderizador — vai para a tela como
  # está, dentro de um iframe sandbox na view. WhatsApp: texto puro, que a view
  # escapa.
  def corpo_do_preview(template, dados)
    r = template.renderizador(dados)
    template.email? ? r.html : r.texto
  end
end
