class Contabilidade::ParcelamentoDoRpps < ApplicationRecord
	has_paper_trail

	include TradutorConcern

	belongs_to :orcamento
	belongs_to :decreto_de_acordo, class_name: 'Contabilidade::Decreto', foreign_key: :decreto_de_acordo_id
	belongs_to :decreto_de_lei, class_name: 'Contabilidade::Decreto', foreign_key: :decreto_de_lei_id

	has_many :acompanhamentos_de_parcelamento_do_rpps, dependent: :restrict_with_exception

	validates_presence_of  :orcamento_id, :decreto_de_acordo_id, :decreto_de_lei_id,:competencias_parceladas, :quantidade_de_parcelas, :valor_total_do_parcelamento, :valor_da_parcela_inicial, :data_do_vencimento_da_primeira_parcela

	validate :valida_alteracao_do_saldo_total_com_parcelamentos, unless: :verifica_saldo_total_com_parcelamentos
	validate :valida_numero_de_parcelas_com_saldo_alterado, if: :verifica_numero_de_parcelas || :quantidade_de_parcelas_menor_que_a_quantidade_de_acompanhamentos?
	validate :possui_saldo_para_parcelar?
	validate :valida_legislacoes, if: :verifica_legislacoes


	def numero_data_funcao
		return "Nº: #{self.decreto_de_lei.numero} | Data: #{self.decreto_de_lei.data_da_legislacao} | #{self.decreto_de_lei.localizar(:funcao_do_instrumento_legal)}"
	end

	def parcelamento_revogado?
		if decreto_de_acordo
			self.decreto_de_acordo.try(:numero_revogado).present? && self.decreto_de_acordo.try(:data_da_revogacao).present?
		end
	end

	def valida_alteracao_do_saldo_total_com_parcelamentos
		errors.add(:valor_total_do_parcelamento, "O Valor Total Não Pode Ser Menor que a Soma das Parcelas")
	end

	def valida_numero_de_parcelas_com_saldo_alterado
		errors.add(:quantidade_de_parcelas, "É preciso ter mais parcelas para está alteração")
	end

	def verifica_numero_de_parcelas
		if quantidade_de_parcelas
			quantidade_de_parcelas_não_pagas < 1 && possui_saldo_para_parcelar?
		end
	end

	def verifica_legislacoes
		if decreto_de_acordo_id.present? && decreto_de_lei_id.present?
			decreto_de_acordo_id == decreto_de_lei_id
		end
	end

	def valida_legislacoes
		errors.add(:decreto_de_acordo_id, "O N° do Acordo não pode ser o mesmo no Nº do Lei Altorizativa")
		errors.add(:decreto_de_lei_id, "O N° da Lei Altorizativa não pode ser o mesmo no Nº do Acordo")
	end

	def quantidade_de_parcelas_menor_que_a_quantidade_de_acompanhamentos?
		quantidade_de_parcelas < acompanhamentos_de_parcelamento_do_rpps.length
	end

	def verifica_saldo_total_com_parcelamentos
		if valor_total_do_parcelamento
			valor_total_do_parcelamento >= valor_total_dos_parcelamentos
		end
	end

	def possui_saldo_para_parcelar?
		if valor_total_do_parcelamento
			valor_total_dos_parcelamentos < valor_total_do_parcelamento
		end
	end

	def saldo_do_parcelamento
		if tem_parcela_inicial?
			valor_total_do_parcelamento - valor_total_dos_parcelamentos
		end
	end

	def quantidade_de_parcelas_não_pagas
		if quantidade_de_parcelas
			quantidade_de_parcelas - acompanhamentos_de_parcelamento_do_rpps.length
		end
	end

	def tem_parcela_inicial?
		acompanhamentos_de_parcelamento_do_rpps.length > 0
	end

	def parcela_atual
		acompanhamentos_de_parcelamento_do_rpps.size
	end

	def parcelas_pagas
		acompanhamentos_de_parcelamento_do_rpps.order(:numero_da_parcela).collect {|parcelamento|parcelamento.numero_da_parcela}
	end

	def valor_das_parcelas
		acompanhamentos_de_parcelamento_do_rpps.sum(:valor_pago_do_principal)
	end

	def valor_total_dos_parcelamentos
		if acompanhamentos_de_parcelamento_do_rpps
			acompanhamentos_de_parcelamento_do_rpps.inject(0) { |sum, pcl| sum + (pcl.valor_pago_do_principal.to_f) }
		end
	end

	def enviado_para_o_sim?
		arquivo_id.present?
	end

	def to_sim(data_referencia)
		# Variáveis necessárias para gerar o SIM
		begin
			exercicio_do_orcamento = orcamento.exercicio.to_s
			unidade_orcamentaria = orcamento.unidades_orcamentarias.joins(:tipo_de_unidade_administrativa).find_by('base_tipos_de_unidades_administrativas.codigo = ?', "07")
	
			texto = ""
			texto << "972".sim_preenche(3) + ","
			texto << Configuracao.first.codigo_do_municipio_no_tcm.sim_preenche(3) + ","
			texto << exercicio_do_orcamento.sim_limite(4, "00") + ","
			texto << unidade_orcamentaria.orgao.codigo.sim_preenche(2) + ","
			texto << unidade_orcamentaria.codigo.codigo_uo_to_sim + ","
			texto << decreto_de_lei.numero.to_s.sim_limite(10) + ","
			texto << decreto_de_lei.data_da_publicacao.sim_data + ","
			texto << decreto_de_acordo.numero.to_s.sim_limite(10) + ","
			texto << decreto_de_acordo.data_da_legislacao.sim_data + ","
			texto << competencias_parceladas.to_s.sim_limite(200) + ","
			texto << valor_total_do_parcelamento.to_f.to_s.sim_valor + ","
			texto << (parcelamento_revogado? ? decreto_de_acordo.numero_revogado.to_s.sim_limite(10) : "0") + ","
			texto << (parcelamento_revogado? ? decreto_de_acordo.data_da_revogacao.sim_data : "0") + ","
			texto << data_referencia.to_s + ","
			texto << quantidade_de_parcelas.to_s.sim_limite(3) + ","
			texto << data_do_vencimento_da_primeira_parcela.sim_data + ","
			texto << valor_da_parcela_inicial.to_f.to_s.sim_valor
	
			return texto
		rescue => e
			if e.class.to_s == "NoMethodError"
				atributo_falho = e.message.split(" ")[2]
				coluna = CSV.parse(texto, :headers => false).last.count
				raise e.mensagem_traduzida(self, "", atributo_falho, coluna)
			else
				raise e
			end
		end
	end
end
