class Contabilidade::TentativaDeMovimentacaoDoPlanoDeContas < ApplicationRecord
  has_paper_trail
  attr_accessor :atualizado_no_form

  belongs_to :evento_contabil, class_name: "Contabilidade::EventoContabil"
  belongs_to :modulo, polymorphic: true
  validates_presence_of :data_da_tentativa, :modulo_type, :modulo_id, :saldo

  before_save :lanca_movimentacao_do_plano_de_contas, if: Proc.new{ self.evento_contabil_id_changed? && self.evento_contabil_id.present? && self.atualizado_no_form.present? }

  def movimentacao_continua_falha?
    self.falhou? && self.evento_contabil.nil?
  end

  def lanca_movimentacao_do_plano_de_contas
    evento_contabil = Contabilidade::EventoContabil.find_by(id: evento_contabil_id)
    evento_contabil.contas_por_eventos_contabeis.each do |conta|
      Contabilidade::MovimentacaoDoPlanoDeContas.create!(
        conta_por_evento_contabil_id: conta.id,
        gerador_id: self.modulo_id,
        gerador_type: self.modulo_type,
        valor: self.saldo,
        data_de_lancamento: self.data_da_tentativa,
        codigo_movimentacao: self.modulo.send(self.retorna_atributo_codigo) || nil,
        unidade_orcamentaria_id: self.modulo.try(:unidade_orcamentaria_id),
        tipo_de_lancamento: Contabilidade::MovimentacaoDoPlanoDeContas.tipo_de_lancamentos[conta.tipo_de_lancamento.to_sym]
      )
    end
  end

  def retorna_atributo_codigo
    case self.modulo.class.name
    when "Contabilidade::Liquidacao"
      return 'numero'
    when "Administrativo::RequisicaoDeMaterial"
      return 'numero_da_requisicao'
    when "Contabilidade::DespesaExtraOrcamentaria"
      return 'numero_de_caixa'
    when "Contabilidade::Empenho"
      return 'numero_do_empenho'
    when "Contabilidade::LancamentoManualDoEventoContabil"
      return 'codigo'
    when "Contabilidade::Pagamento"
      return 'numero'
    when "Contabilidade::TalaoDeReceita"
      return 'numero_do_talao'
    when "GestaoDeEstoque::RecebimentoDeMaterial"
      return 'codigo'
    when "GestaoDeEstoque::Transferencia"
      return 'codigo'
    when "Contabilidade::CancelamentoDeRestoAPagar"
      return 'decreto'
    when "Contabilidade::MedicaoDaObra"
      return "art"
    when "Contabilidade::AnulacaoDoEmpenho"
      return "numero"
    end
  end
end
