class Contabilidade::RestoAPagarCancelado < ApplicationRecord
	has_paper_trail
	include TradutorConcern

	belongs_to :empenho, class_name: 'Contabilidade::Empenho', required: true
	belongs_to :cancelamento_de_resto_a_pagar, class_name: 'Contabilidade::CancelamentoDeRestoAPagar', required: true

	has_many :liquidacoes_dos_rps_cancelados, class_name: 'Contabilidade::LiquidacaoDoRpCancelado'
	has_many :itens_dos_rps_cancelados, class_name: 'Contabilidade::ItemDoRpCancelado'
	has_many :itens_das_liquidacoes_canceladas, through: :liquidacoes_dos_rps_cancelados, source: :itens_dos_rps_cancelados
	has_many :liquidacoes, through: :empenho do
		def nao_processados(orcamento)
			where('extract(year from data_da_liquidacao) = ? or data_da_liquidacao IS NULL', orcamento.exercicio)
		end

		def processados(orcamento)
			where('extract(year from data_da_liquidacao) <= ?', orcamento.exercicio - 1)
		end
	end

	accepts_nested_attributes_for :liquidacoes_dos_rps_cancelados, reject_if: proc { |a| a['valor_cancelado'].blank? }, allow_destroy: true
	accepts_nested_attributes_for :itens_dos_rps_cancelados, reject_if: :all_blank, allow_destroy: true

	validates :itens_dos_rps_cancelados, uniq_nested_attributes: { atributo: :item_id, mensagem: "Item deve ser único" }
	validate :valida_valor_a_ser_cancelado

	scope :sem_valor_cancelado, -> { where('coalesce(valor_cancelado, 0) = 0') }

	before_save :preenche_valores

	def preenche_valores
		if self.liquidacoes_dos_rps_cancelados.any?
			self.valor_cancelado = self.liquidacoes_dos_rps_cancelados.sum(&:valor_cancelado)
		elsif self.itens_dos_rps_cancelados.any?
			self.valor_cancelado = self.itens_dos_rps_cancelados.sum(&:total)
		end

		unless self.saldo_original.present?
			if self.cancelamento_de_resto_a_pagar.nao_processado?
				self.saldo_original = self.empenho.saldo_atual_nao_processado_a_liquidar
			elsif self.cancelamento_de_resto_a_pagar.processado?
				self.saldo_original = self.empenho.saldo_atual_processado
			end
		end

		self.saldo_atual = self.saldo_original.to_d - self.valor_cancelado.to_d
	end

	def valida_valor_a_ser_cancelado
		if empenho.present? && valor_cancelado.present?
			if self.cancelamento_de_resto_a_pagar.processado?
				errors.add(:valor_cancelado, 'O valor não pode ser maior que o saldo processado do empenho') if  valor_cancelado.to_f.round(2) > empenho.saldo_atual_processado.to_f.round(2) + valor_cancelado_was.to_f.round(2)
			else
				errors.add(:valor_cancelado, 'O valor não pode ser maior que o saldo não processado a liquidar do empenho') if  valor_cancelado.to_f.round(2) > empenho.saldo_atual_nao_processado.to_f.round(2) + valor_cancelado_was.to_f.round(2)
			end
		end
	end

	def valor_unitario_do_item_rp(item_id, liquidacao_id = nil)
		if liquidacao_id.present?
			item_da_liquidacao = self.empenho.liquidacoes.find(liquidacao_id).itens_da_nota_fiscal.where(item_id: item_id).first
			valor_unitario_do_item_rp = item_da_liquidacao.valor_unitario
		else
			item_do_empenho = self.empenho.itens_do_empenho.where(item_id: item_id).first
			valor_unitario_do_item_rp = item_do_empenho.valor_unitario
		end

		return valor_unitario_do_item_rp
  end

	def quantidade_disponivel_a_cancelar_do_item(item_id, liquidacao_id = nil)
		if liquidacao_id.present?
			item_da_liquidacao = self.empenho.liquidacao.find(liquidacao_id).itens_da_nota_fiscal.where(item_id: item_id).first
			quantidade_a_cancelar_do_item = item_da_liquidacao.quantidade
		else
			item_do_empenho = self.empenho.itens_do_empenho.where(item_id: item_id).first
			quantidade_a_cancelar_do_item =  item_do_empenho.quantidade_disponivel_a_liquidar
		end
	end

end
