# app/controllers/admin/contatos_controller.rb
#
# Cadastro manual de quem recebe as mensagens: nome, WhatsApp e/ou e-mail, e o
# grupo. O telefone é normalizado para E.164 no model — o ADM digita como quiser.
class Admin::ContatosController < ApplicationController
  before_action :set_contato, only: %i[edit update destroy]
  before_action :carregar_grupos, only: %i[new create edit update]

  def index
    authorize Contato
    @grupos = GrupoContato.ordenados
    escopo  = policy_scope(Contato).includes(:grupo_contato)
    escopo  = escopo.where(grupo_contato_id: params[:grupo_id]) if params[:grupo_id].present?
    escopo  = escopo.where('LOWER(nome) LIKE :q OR telefone LIKE :q OR LOWER(email) LIKE :q',
                           q: "%#{params[:q].to_s.strip.downcase}%") if params[:q].present?
    @contatos = escopo.ordenados
  end

  # GET /admin/contatos/grupos_whatsapp (JSON)
  def grupos_whatsapp
    authorize Contato, :create?

    resposta = Notificacao::ClienteWhatsapp.padrao.grupos
    if resposta.ok?
      render json: { grupos: resposta.dados['grupos'] || [] }
    else
      render json: { erro: resposta.erro, grupos: [] }, status: :ok
    end
  end

  def new
    @contato = Contato.new(grupo_contato_id: params[:grupo_id], tipo: params[:tipo].presence || 'pessoa')
    authorize @contato
  end

  def create
    @contato = Contato.new(contato_params)
    authorize @contato

    if @contato.save
      registrar("Cadastrou contato #{@contato.nome}")
      redirect_to admin_contatos_path, notice: 'Contato cadastrado.'
    else
      render :new, status: :unprocessable_entity
    end
  end

  def edit
    authorize @contato
  end

  def update
    authorize @contato

    if @contato.update(contato_params)
      registrar("Editou contato #{@contato.nome}")
      redirect_to admin_contatos_path, notice: 'Contato atualizado.'
    else
      render :edit, status: :unprocessable_entity
    end
  end

  def destroy
    authorize @contato
    nome = @contato.nome
    @contato.destroy
    registrar("Excluiu contato #{nome}")
    redirect_to admin_contatos_path, notice: 'Contato removido.'
  end

  private

  def set_contato
    @contato = Contato.find(params[:id])
  end

  def carregar_grupos
    @grupos = GrupoContato.ativos.ordenados
  end

  def contato_params
    params.require(:contato).permit(:nome, :telefone, :email, :grupo_contato_id, :ativo,
                                    :observacao, :tipo, :whatsapp_grupo_jid, :whatsapp_grupo_nome)
  end

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