class Contabilidade::InvestimentoDoRpps < ApplicationRecord
	has_paper_trail

	include TradutorConcern
	belongs_to :orcamento
	belongs_to :fundo_de_investimento
	belongs_to :arquivo, class_name: 'Tcm::Arquivo', required: false

	validates_uniqueness_of :mes_de_competencia, scope: [:fundo_de_investimento_id, :ano_de_competencia]

	validates_presence_of :mes_de_competencia, :ano_de_competencia, :valor_da_aplicacao, :valor_do_resgate, :valor_do_rendimento, :saldo_inicial, :fundo_de_investimento_id

	enum mes_de_competencia: {
		janeiro: 1,
		fevereiro: 2,
		março: 3,
		abril: 4,
		maio: 5,
		junho: 6,
		julho: 7,
		agosto: 8,
		setembro: 9,
		outubro: 10,
		novembro: 11,
		dezembro: 12
	}

	def competencia
		return "#{mes_de_competencia.try(:capitalize)} de #{ano_de_competencia.to_s}"
	end

	def valor_total
		if self.perdas
			saldo_inicial.to_f + valor_da_aplicacao.to_f - valor_do_resgate.to_f - valor_do_rendimento.to_f
		else
			saldo_inicial.to_f + valor_da_aplicacao.to_f - valor_do_resgate.to_f +  valor_do_rendimento.to_f
		end
		
	
	end

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

	def to_sim(data_de_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 << "967".sim_preenche(3) + ","
			texto << Configuracao.first.codigo_do_municipio_no_tcm.sim_preenche(3) + ","
			texto << exercicio_do_orcamento.sim_limite_sem_aspas(4, "00") + ","
			texto << (unidade_orcamentaria.present? ? unidade_orcamentaria.orgao.codigo.sim_preenche(2) : "''") + ","
			texto << (unidade_orcamentaria.present? ? unidade_orcamentaria.codigo.codigo_uo_to_sim : "''") + ","
			texto << (fundo_de_investimento.conta_bancaria.present? ? fundo_de_investimento.conta_bancaria.agencia.banco.numero_do_banco.to_s.sim_preenche(4) : "''") + ","
			texto << (fundo_de_investimento.conta_bancaria.present? ? fundo_de_investimento.conta_bancaria.agencia.numero_da_agencia.to_s.delete(".\/-").first(4).sim_preenche(6) : '""') + ","
			texto << (fundo_de_investimento.conta_bancaria.present? ? fundo_de_investimento.conta_bancaria.numero_da_conta.tr('-', '').tr('.', '').to_s.sim_preenche(10) : "''") + ","
			texto << (fundo_de_investimento.pessoa.present? ? fundo_de_investimento.pessoa.cpf_ou_cnpj_sem_pontos.to_s.sim_preenche(14) : "''") + ","
			texto << data_de_referencia.to_s + ","
			texto << fundo_de_investimento.nome_do_fundo.to_s.sim_limite(50) + ","
			texto << fundo_de_investimento.percentual_da_alocacao_de_recurso.codigo_para_o_sim.to_s.sim_preenche(3) + ","
			texto << saldo_inicial.to_f.to_s.sim_valor  + ","
			texto << valor_da_aplicacao.to_f.to_s.sim_valor  + ","
			texto << valor_do_resgate.to_f.to_s.sim_valor  + ","
			texto << valor_do_rendimento.to_f.to_s.sim_valor  + ","
			texto << valor_total.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
