# app/models/variavel_personalizada.rb
#
# Variável criada pelo ADM, com valor fixo, usável em qualquer mensagem.
class VariavelPersonalizada < ApplicationRecord
  # Nome da tabela fixado: o Inflector pt-BR não resolve variavel → variaveis.
  self.table_name = 'variaveis_personalizadas'

  # Mesmo formato que o renderizador aceita em {{...}}: letras minúsculas,
  # números e _ . Sem isso, o ADM cadastraria "Telefone Suporte" e a variável
  # nunca seria substituída — falha muda dentro da mensagem enviada.
  FORMATO_CHAVE = /\A[a-z][a-z0-9_]*\z/

  before_validation :normalizar

  validates :chave, presence: true, uniqueness: { case_sensitive: false },
                    format: { with: FORMATO_CHAVE,
                              message: 'use apenas letras minúsculas, números e _ (ex.: telefone_suporte)' }
  validates :valor, presence: true
  validate  :nao_colidir_com_variavel_do_sistema

  scope :ativas,     -> { where(ativo: true) }
  scope :ordenadas,  -> { order(:chave) }

  def marcador = "{{#{chave}}}"

  private

  def normalizar
    self.chave = chave.to_s.strip.downcase.tr(' ', '_')
    self.valor = valor.to_s.strip
  end

  # Deixar o ADM criar {{valor}} ou {{motorista}} faria a variável dele
  # sobrescrever (ou ser sobrescrita por) a do sistema, dependendo da ordem —
  # exatamente o tipo de bug que não aparece no preview e aparece no envio.
  def nao_colidir_com_variavel_do_sistema
    return if chave.blank?

    reservadas = Notificacao::CatalogoVariaveis::SISTEMA.keys +
                 Notificacao::CatalogoVariaveis::CONTEXTO.keys +
                 Notificacao::CatalogoVariaveis::DADOS.keys
    return unless reservadas.include?(chave)

    errors.add(:chave, "já existe no sistema — escolha outro nome (ex.: #{chave}_empresa)")
  end
end
