class Contabilidade::AlocacaoDeRecursoDeRpps < ApplicationRecord
	has_paper_trail

	belongs_to :orcamento
	belongs_to :arquivo, class_name: 'Tcm::Arquivo', required: false
	has_many :percentuais_da_alocacao_de_recurso
	validates_presence_of :data_da_reuniao, :percentual_da_meta_de_rentabilidade, :meta_de_rentabilidade

	accepts_nested_attributes_for :percentuais_da_alocacao_de_recurso, allow_destroy: true

	validate :valida_soma_dos_percentuais
	validate :valida_percentual_totalmente_preenchido

	def valida_soma_dos_percentuais
		errors.add(:percentuais_da_alocacao_de_recurso, "soma dos percentuais deve ser menor ou igual a 100%") if percentuais_da_alocacao_de_recurso.inject(0){|total, tema| total + tema.valor.to_f}.to_f > 100
	end

	def enviado_ao_sim?
		arquivo_id.present? && arquivo_id > 0 && arquivo.lote.lote_processado_ou_enviado?
	end

	def to_sim(data_de_referencia, percentual_da_alocacao_de_recurso)
		# 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 << "971".sim_preenche(3) + "," #1
			texto << Configuracao.first.codigo_do_municipio_no_tcm.sim_preenche(3) + "," #2
			texto << exercicio_do_orcamento.sim_limite(4, "00") + "," #3
			texto << (unidade_orcamentaria.present? ? unidade_orcamentaria.orgao.codigo.sim_preenche(2) : "''") + "," #4
			texto << (unidade_orcamentaria.present? ? unidade_orcamentaria.codigo.codigo_uo_to_sim : "''") + "," #5
			texto << data_da_reuniao.sim_data + "," #6
			texto << percentual_da_alocacao_de_recurso.codigo_para_o_sim.to_s.sim_limite(3) + ","#7
			texto << percentual_da_alocacao_de_recurso.valor.to_f.to_s.sim_valor  + "," #8
			texto << data_de_referencia.to_s + "," #9
			texto << percentual_da_meta_de_rentabilidade.to_f.to_s.sim_valor  + "," #10
			texto << meta_de_rentabilidade.to_s.sim_limite(60)#11
			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

	def percentual_total
		@percentual_total ||= self.percentuais_da_alocacao_de_recurso.sum(&:valor)
	end

	def percentual_totalmente_preenchido?
		return self.percentual_total == 100
	end

	def valida_percentual_totalmente_preenchido
		errors.add(:percentual_100, 'Soma dos percentuais deve ser 100%') unless percentual_totalmente_preenchido?
	end


end
