class Contabilidade::NaturezaDaReceitaDaConfiguracaoContabil < ApplicationRecord
  has_paper_trail
  attr_accessor :veio_do_form

  belongs_to :configuracao_do_evento_contabil, class_name: "Contabilidade::ConfiguracaoDoEventoContabil"

  before_validation :preenche_campos_baseado_no_codigo_completo, if: Proc.new{ codigo_completo.present? }
  before_validation :preenche_campos_com_zeros_antes, if: Proc.new{ new_record? }
  before_validation :formata_codigo_completo, if: Proc.new { codigo_completo.present? }

  before_create :preenche_com_zero_os_campos_vazios
  before_create :monta_codigo_completo

  validates_presence_of :codigo_completo, if: Proc.new { self.veio_do_form == "true" }

  def formata_codigo_completo
    self.codigo_completo = self.codigo_completo.tr(".", "")
  end

  def preenche_campos_baseado_no_codigo_completo
    self.categoria_economica = codigo_completo[0..2]
    self.origem = codigo_completo[3]
    self.especie = codigo_completo[4]
    self.rubrica = codigo_completo[5]
    self.alinea = codigo_completo[6..7]
    self.subalinea = codigo_completo[8]
    self.detalhamento_optativo = codigo_completo[9]
    self.nivel_opcional_1 = codigo_completo[10..11]
    self.nivel_opcional_2 = codigo_completo[12..13]
    self.nivel_opcional_3 = codigo_completo[14..15]
  end

  def preenche_com_zero_os_campos_vazios
    Contabilidade::NaturezaDaReceitaDaConfiguracaoContabil.column_names.each do |nome_do_campo|
      if nome_do_campo_faz_parte_do_codigo_da_receita?(nome_do_campo)
        tamanho_do_campo = Contabilidade::NaturezaDaReceitaDaConfiguracaoContabil.columns_hash[nome_do_campo].limit

        self.send(nome_do_campo + '=', "0" * tamanho_do_campo) if self.send(nome_do_campo).nil?
      end
    end
  end

  def nome_do_campo_faz_parte_do_codigo_da_receita?(nome_do_campo)
    nome_do_campo == 'categoria_economica' || nome_do_campo == 'origem' || nome_do_campo == 'especie' ||
    nome_do_campo == 'rubrica' || nome_do_campo == 'alinea' || nome_do_campo == 'subalinea' ||
    nome_do_campo == 'detalhamento_optativo' || nome_do_campo == 'nivel_opcional_1' || nome_do_campo == 'nivel_opcional_2' ||
    nome_do_campo == 'nivel_opcional_3'
  end

  def preenche_campos_com_zeros_antes
    ['categoria_economica', 'alinea', 'nivel_opcional_1', 'nivel_opcional_2','nivel_opcional_3'].each do |nome_do_campo|
      campo = self.send(nome_do_campo)
      if campo.present?
        tamanho_restante_do_campo = Contabilidade::NaturezaDaReceitaDaConfiguracaoContabil.columns_hash[nome_do_campo].limit - campo.length
        self.send(nome_do_campo + '=', campo.insert(0, '0' * tamanho_restante_do_campo) ) if tamanho_restante_do_campo > 0
      end
    end
  end

  def naturezas_da_receita
    queries = Array.new

    Contabilidade::NaturezaDaReceitaDaConfiguracaoContabil.column_names.each do |nome_do_campo|
      if nome_do_campo_faz_parte_do_codigo_da_receita?(nome_do_campo)
        valor_do_campo = self.send(nome_do_campo)

        if !valor_do_campo.split("").all?{ |caracter| caracter == '0' }
          queries.push("#{nome_do_campo} = '#{valor_do_campo}' ")
        end
      end
    end

    if queries.any?
      Base::NaturezaDaReceita.where(queries.join(" AND "))
    end
  end

  def monta_codigo_completo
    self.codigo_completo = categoria_economica + origem + especie + rubrica + alinea + subalinea + detalhamento_optativo + nivel_opcional_1 + nivel_opcional_2 + nivel_opcional_3
  end

  def codigo_de_competencia
    "#{categoria_economica.chars.all?("0") ? "XXX" : categoria_economica}.#{origem.tr("0", "X")}.#{especie.tr("0", "X")}.#{rubrica.tr("0", "X")}.#{alinea.tr("0", "X")}.#{subalinea.tr("0", "X")}.#{detalhamento_optativo.tr("0", "X")}.#{nivel_opcional_1.tr("0", "X")}.#{nivel_opcional_2.tr("0", "X")}.#{nivel_opcional_3.tr("0", "X")}"
  end
end
