class Contabilidade::SubElementoDeDespesaDaConfiguracaoContabil < ApplicationRecord
  has_paper_trail

  attr_accessor :elemento_de_despesa_id
  attr_accessor :incluir_todos_sub_elementos
  attr_accessor :elemento_duplicado
  attr_accessor :sub_elemento_antigo_id

  attr_default :incluir_todos_sub_elementos, false

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

  delegate :elemento_de_despesa, to: :sub_elemento_de_despesa
  before_validation :formata_incluir_todos_sub_elementos, if: Proc.new { self.incluir_todos_sub_elementos == "1" }

  validates_presence_of :sub_elemento_de_despesa_id, if: Proc.new { self.incluir_todos_sub_elementos == '0' }

  validate :valida_que_nao_existe_elementos_repetidos
  after_create :cria_todos_sub_elementos, if: Proc.new { self.incluir_todos_sub_elementos == '1' && self.elemento_de_despesa_id.present? }
  after_initialize :disponibiliza_elemento_de_despesa_id

  def todos_sub_elementos_da_despesa
    elemento_de_despesa.sub_elementos_de_despesa rescue Array.new
  end

  def valida_que_nao_existe_elementos_repetidos
    unless self.sub_elemento_de_despesa_id.nil?
      sub_elementos_iguais_a_esse = configuracao_do_evento_contabil.sub_elementos_de_despesa_da_configuracao_contabil.map { |e| e if ( e.sub_elemento_de_despesa_id.present? && e.sub_elemento_de_despesa_id != nil && e.sub_elemento_de_despesa_id == self.sub_elemento_de_despesa_id ) }.compact
      if sub_elementos_iguais_a_esse.size >= 2 || self.incluir_todos_sub_elementos == "1" &&  configuracao_do_evento_contabil.sub_elementos_de_despesa_da_configuracao_contabil.size > 1 && configuracao_do_evento_contabil.sub_elementos_de_despesa_da_configuracao_contabil.any? { |e| e.sub_elemento_de_despesa_id.present? && e.sub_elemento_de_despesa_id != nil && e.elemento_de_despesa_id == self.elemento_de_despesa_id }
        errors.add(:sub_elemento_de_despesa_id, "Não podem ser iguais")
      end
    end
  end

  def cria_todos_sub_elementos
    elemento_de_despesa = Base::ElementoDeDespesa.find(self.elemento_de_despesa_id)
    elemento_de_despesa.sub_elementos_de_despesa.ativos.ids.each do |sub_elemento_id|
      Contabilidade::SubElementoDeDespesaDaConfiguracaoContabil.find_or_create_by!(sub_elemento_de_despesa_id: sub_elemento_id, configuracao_do_evento_contabil_id: self.configuracao_do_evento_contabil_id)
    end
    self.destroy if self.sub_elemento_de_despesa_id.nil?
  end

  def formata_incluir_todos_sub_elementos
    self.incluir_todos_sub_elementos == "1" ? true : false
  end

  def disponibiliza_elemento_de_despesa_id
    if self.sub_elemento_de_despesa.present?
      self.elemento_de_despesa_id = self.sub_elemento_de_despesa.elemento_de_despesa_id
    end
  end
end
