# app/models/grupo_contato.rb
#
# Grupo de destinatários (Diretoria, Operação, Motoristas, Cliente...). É o
# GRUPO que assina os eventos: cadastrar alguém novo é escolher o grupo, não
# repetir a configuração pessoa por pessoa.
class GrupoContato < ApplicationRecord
  self.table_name = 'grupos_contato'

  has_many :contatos, dependent: :nullify
  has_many :assinaturas, class_name: 'GrupoEventoAssinatura', dependent: :destroy
  has_many :eventos, through: :assinaturas, source: :evento_notificacao

  validates :nome, presence: true
  validate  :nome_unico

  scope :ativos, -> { where(ativo: true) }
  scope :ordenados, -> { order(Arel.sql('LOWER(nome)')) }

  before_validation { self.nome = nome.to_s.strip.squeeze(' ').presence }

  # Contatos que devem receber ESTE evento por ESTE canal.
  def destinatarios(canal)
    return GrupoContato.none unless ativo?

    contatos.ativos.com_canal(canal)
  end

  private

  # Índice único é sobre LOWER(nome); validar aqui dá a mensagem amigável em vez
  # de estourar RecordNotUnique na tela.
  def nome_unico
    return if nome.blank?

    existe = GrupoContato.where.not(id: id).where('LOWER(nome) = ?', nome.downcase).exists?
    errors.add(:nome, 'já existe') if existe
  end
end
