class Contabilidade::AnulacaoDaContaExtra < ApplicationRecord
  include TradutorConcern

  has_paper_trail
  belongs_to :conta_extra_orcamentaria, required: true
  belongs_to :unidade_orcamentaria, class_name: 'Loa::UnidadeOrcamentaria'
  belongs_to :orcamento

  has_many :lancamentos_extraorcamentario_despesa, as: :modulo

  validates_presence_of :data, :motivo_do_cancelamento, :valor, :historico
  validates_numericality_of :valor, greater_than: 0
  validates :data, date: true
  validate :valor_maior_que_o_saldo, on: :create

  after_save :gera_lancamento_extraorcamentario
  after_destroy :apagar_movimento_extraorcamentario

  enum motivo_do_cancelamento:{
    consolidacao: 1,
    outros: 2
  }

  def gera_lancamento_extraorcamentario
		ActiveRecord::Base.transaction do
			if valor.to_f > 0
				if lancamentos_extraorcamentario_despesa.any?
					lancamentos_extraorcamentario_despesa.each do |lancamento|
						if lancamento.try(:valor).to_f != valor.to_f
							apagar_movimento_extraorcamentario
							cria_lancamentos_da_conta_extraorcamentaria
						end
					end
				else
					cria_lancamentos_da_conta_extraorcamentaria
				end
			end
		end
	end

  def apagar_movimento_extraorcamentario
    lancamentos_extraorcamentario_despesa.try(:destroy_all)
  end

  def cria_lancamentos_da_conta_extraorcamentaria
    movimentacao = Contabilidade::LancamentoExtraorcamentarioDespesa.new(
      conta_extra_orcamentaria_id: self.conta_extra_orcamentaria_id,
      data_do_lancamento: self.data,
      valor: valor,
      modulo: self
    )
    movimentacao.save
  end

  private
  # VALIDAÇÕES
  def valor_maior_que_o_saldo
    if self.valor && self.valor > 0
      saldo_total = conta_extra_orcamentaria.contas_extra_por_unidades_orcamentarias.find_by(unidade_orcamentaria_id: self.unidade_orcamentaria.id).saldo - conta_extra_orcamentaria.anulacoes_da_conta_extra.where(unidade_orcamentaria_id: self.unidade_orcamentaria.id).sum(:valor)
      errors.add(:valor, "não pode ser maior que o saldo da conta extraorçamentária") if conta_extra_orcamentaria.present? && (self.valor.to_f > saldo_total)
    end
  end
end
