class Contabilidade::LiquidacaoDoControleDePagamento < ApplicationRecord
	has_paper_trail
	attr_accessor :valor_liquidacao
	include TradutorConcern

	attr_accessor :avancar

	belongs_to :liquidacao, class_name: 'Contabilidade::Liquidacao', required: true
	belongs_to :controle_de_pagamento, class_name: 'Contabilidade::ControleDePagamento', required: true
	belongs_to :conta_destino, class_name: 'Base::PessoaContaBancaria'

	has_many :contas_das_liquidacoes_do_controle_de_pagamento, class_name: 'Contabilidade::ContaDaLiquidacaoDoControleDePagamento'
	has_many :erros_de_pagamento, class_name: "Contabilidade::ErroDePagamento", as: :modulo, dependent: :destroy

	accepts_nested_attributes_for :contas_das_liquidacoes_do_controle_de_pagamento, reject_if: :all_blank, allow_destroy: true
	validates_associated :contas_das_liquidacoes_do_controle_de_pagamento

  validate :soma_dos_valores_das_contas, on: :update
	validate :obriga_conta_destino

	validates :contas_das_liquidacoes_do_controle_de_pagamento, uniq_nested_attributes: { atributo: :conta_origem_id, mensagem: "Não pode haver contas origem iguais" }

	def valor_liquido_da_liquidacao
		valor_da_liquidacao = liquidacao.valor
		valor_das_retencoes = liquidacao.valor_das_retencoes
		return valor_da_liquidacao - valor_das_retencoes
	end

	def soma_dos_valores_das_contas
		valor_das_contas = contas_das_liquidacoes_do_controle_de_pagamento.reject(&:marked_for_destruction?).inject(0) do |total, conta|
			total = conta.valor_da_conta_origem.to_f
		end

		unless valor_das_contas.to_f == valor_liquido_da_liquidacao.to_f
			errors.add(:valor_da_conta_origem, "O valor colocado nas contas (#{valor_das_contas.to_f.real_contabil}) deve ser igual ao valor líquido da liquidação (#{valor_liquido_da_liquidacao.to_f.real_contabil})")
		end
	end

	def obriga_conta_destino
		errors.add(:conta_destino, "É preciso informar a conta destino") if (self.contas_das_liquidacoes_do_controle_de_pagamento.any? && !self.conta_destino_id.present?)
	end

	def possui_contas?
		self.contas_das_liquidacoes_do_controle_de_pagamento.size > 0 ? true : false
	end

end
