# app/controllers/admin/grupos_contato_controller.rb
#
# Grupos de destinatários. É o grupo que assina os eventos, então cadastrar
# alguém novo é escolher o grupo — não repetir a configuração pessoa por pessoa.
class Admin::GruposContatoController < ApplicationController
  before_action :set_grupo, only: %i[edit update destroy]

  def index
    authorize GrupoContato
    @grupos = policy_scope(GrupoContato).ordenados
                                        .includes(:contatos, assinaturas: :evento_notificacao)
  end

  def new
    @grupo = GrupoContato.new
    authorize @grupo
  end

  def create
    @grupo = GrupoContato.new(grupo_params)
    authorize @grupo

    if @grupo.save
      registrar("Criou grupo de contatos #{@grupo.nome}")
      redirect_to admin_grupos_path, notice: 'Grupo criado.'
    else
      render :new, status: :unprocessable_entity
    end
  end

  def edit
    authorize @grupo
  end

  def update
    authorize @grupo

    if @grupo.update(grupo_params)
      registrar("Editou grupo de contatos #{@grupo.nome}")
      redirect_to admin_grupos_path, notice: 'Grupo atualizado.'
    else
      render :edit, status: :unprocessable_entity
    end
  end

  def destroy
    authorize @grupo

    # `dependent: :nullify`: os contatos NÃO são apagados junto — ficam sem
    # grupo e param de receber, o que é reversível. Apagar pessoas porque o
    # grupo saiu seria destrutivo demais para um clique.
    nome = @grupo.nome
    orfaos = @grupo.contatos.count
    @grupo.destroy
    registrar("Excluiu grupo de contatos #{nome} (#{orfaos} contato(s) ficaram sem grupo)")
    redirect_to admin_grupos_path,
                notice: "Grupo removido. #{orfaos} contato(s) ficaram sem grupo e não recebem mais."
  end

  private

  def set_grupo
    @grupo = GrupoContato.find(params[:id])
  end

  def grupo_params
    params.require(:grupo_contato).permit(:nome, :descricao, :ativo)
  end

  def registrar(detalhes)
    AuditoriaLog.registrar(user: current_user, acao: 'grupo_contato', entidade: 'GrupoContato',
                           dados_novos: { detalhes: detalhes }, request: request)
  end
end
