# app/services/notificacao/blocos.rb
#
# Catálogo dos blocos que o ADM pode empilhar no editor. É a ÚNICA fonte da
# verdade sobre quais tipos existem e quais campos cada um tem — o editor monta
# a paleta a partir daqui, o model valida a partir daqui e o renderizador
# desenha a partir daqui.
#
# Bloco desconhecido é DESCARTADO na gravação (ver MensagemTemplate): sem isso,
# um JSON adulterado no form viraria conteúdo renderizado sem passar por
# validação nenhuma.
module Notificacao
  module Blocos
    # tipo => { rotulo:, campos: { chave => tipo_do_campo } }
    # tipo_do_campo: :texto (uma linha) | :multilinha | :lista (tabela)
    CATALOGO = {
      'cabecalho' => {
        rotulo: 'Cabeçalho',
        dica:   'Título da mensagem, em destaque.',
        campos: { 'titulo' => :texto, 'subtitulo' => :texto }
      },
      'texto' => {
        rotulo: 'Texto',
        dica:   'Parágrafo livre. Use as variáveis para personalizar.',
        campos: { 'texto' => :multilinha }
      },
      'tabela' => {
        rotulo: 'Tabela de valores',
        dica:   'Pares rótulo/valor — entregas, valor, período…',
        campos: { 'linhas' => :lista }
      },
      'aviso' => {
        rotulo: 'Aviso de mudança',
        dica:   'Destaque em amarelo. Bom para "o que foi alterado".',
        campos: { 'texto' => :multilinha }
      },
      'botao' => {
        rotulo: 'Botão / link',
        dica:   'No e-mail vira botão; no WhatsApp, o link em texto.',
        campos: { 'rotulo' => :texto, 'url' => :texto }
      },
      'divisor' => {
        rotulo: 'Divisor',
        dica:   'Linha separando seções.',
        campos: {}
      },
      'rodape' => {
        rotulo: 'Rodapé',
        dica:   'Texto pequeno no fim (assinatura, aviso legal).',
        campos: { 'texto' => :multilinha }
      }
    }.freeze

    TIPOS = CATALOGO.keys.freeze

    def self.valido?(tipo) = TIPOS.include?(tipo.to_s)
    def self.campos(tipo)  = CATALOGO.dig(tipo.to_s, :campos) || {}
    def self.rotulo(tipo)  = CATALOGO.dig(tipo.to_s, :rotulo) || tipo.to_s

    # Bloco novo com os campos vazios — usado pelo editor ao arrastar da paleta.
    def self.vazio(tipo)
      campos(tipo).to_h { |chave, especie| [chave, especie == :lista ? [] : ''] }
                  .merge('tipo' => tipo.to_s)
    end
  end
end
