require 'active_support/concern'

module Tcm::TalaoDeReceitaExtraConcern extend ActiveSupport::Concern
	# TX______.DCR
	# ARQUIVO 403

	def pesquisa_taloes_extra
		Contabilidade::TalaoDeReceita.joins(unidade_orcamentaria: :tipo_de_unidade_administrativa)
		.where('base_tipos_de_unidades_administrativas.poder_associado = ?', self.lote.poder_associado)
		.where('contabilidade_taloes_de_receita.arquivo_id is null OR contabilidade_taloes_de_receita.arquivo_id = ?', self.id)
		.where('contabilidade_taloes_de_receita.origem_do_talao = 1 AND contabilidade_taloes_de_receita.data_do_talao BETWEEN ? AND ?',self.lote.data_referencia, self.lote.data_referencia.end_of_month).distinct.all
	end

	def gerar_talao_de_receita_extra
		conteudo = ''
		taloes = pesquisa_taloes_extra

		taloes.each do |talao|
			conteudo << talao_de_receita_extra_to_sim(talao)
			conteudo << "\r\n"
			talao.update_column(:arquivo_id, self.id)
		end
		self.update_columns(conteudo:conteudo, classe:'Contabilidade::TalaoDeReceita')
	end

	def talao_de_receita_extra_to_sim(talao)
		begin
			numero_do_banco = (talao.try(:conta_bancaria_por_unidade_orcamentaria).try(:conta_bancaria).try(:agencia).try(:banco).try(:numero_do_banco).try(:to_s)) rescue ""
			if numero_do_banco.present? && numero_do_banco.size > 0
				numero_do_banco = numero_do_banco.insert(0, "0" * (4 - numero_do_banco.size || 0)) if numero_do_banco.try(:size).to_f < 4
			else
				numero_do_banco = "9999"
			end

			numero_da_agencia = talao.conta_bancaria_por_unidade_orcamentaria.conta_bancaria.agencia.numero_da_agencia.to_s.delete(".\/-").first(4) rescue ""
			if numero_do_banco.present? && numero_da_agencia.size > 0
				numero_da_agencia = numero_da_agencia.to_s.length < 6 ? numero_da_agencia.to_s.sim_preenche(6) : numero_da_agencia.to_s.sim_limite(6)
			else
				numero_da_agencia = '""'
			end

			numero_da_conta = talao.try(:conta_bancaria_por_unidade_orcamentaria).try(:conta_bancaria).try(:numero_da_conta) .gsub("-",'').gsub(".",'') rescue ""
			if numero_do_banco.present? && numero_da_conta.size > 0
				numero_da_conta = numero_da_conta.to_s.length > 10 ? numero_da_conta.to_s.sim_limite(10) : numero_da_conta.to_s.sim_preenche(10)
			else
				numero_da_conta = '""'
			end

			codigo_para_o_sim = talao.conta_extra_orcamentaria.codigo_para_o_sim(talao.unidade_orcamentaria_id)

			texto = ""
			texto << "403".to_s.sim_preenche(3) + "," #1
			texto << Configuracao.first.codigo_do_municipio_no_tcm.to_s.sim_preenche(3) + "," #2
			texto << talao.orcamento.exercicio.to_s + "00" + "," #3
			texto << talao.unidade_orcamentaria.orgao.codigo.sim_limite(2) + "," #4
			texto << talao.unidade_orcamentaria.codigo.codigo_uo_to_sim + ","#5
			texto << codigo_para_o_sim.to_s + ","#6
			texto << talao.numero_do_talao.sim_limite(8) + "," #7
			texto << talao.data_do_talao.sim_data + "," #8
			texto << (self.try(:lote).present? ? self.lote.exercicio_e_mes_de_geracao : self.exercicio_e_mes_de_geracao).to_s + "," #9
			texto << talao.valor.to_f.to_s.sim_valor + "," #10
			texto << talao.historico.to_s.sim_descricao.sim_limite(255) + "," #11
			texto << talao.pessoa.tipo_pessoa_to_sim.to_s.sim_limite(1) + "," #12

			if talao.pessoa.diversos_contribuintes?
				texto << talao.id.to_s.sim_limite(25)+ "," #13
			else
				texto << CPF.new(talao.pessoa.cpf_ou_cnpj).stripped.to_s.sim_limite(25)+ "," #13
			end

			texto << talao.pessoa.nome.strip.sim_limite(60) + "," # 14
			texto << numero_do_banco.sim_limite(4) + "," # 15
			texto << numero_da_agencia + "," #16
			texto << numero_da_conta + "," #17
			texto << talao.numero_do_talao.to_s.sim_limite(20) + "," #18
			texto << talao.data_do_talao.sim_data + "," #19
			texto << talao.read_attribute_before_type_cast(:tipo_de_documento).to_s #20

			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(talao, talao.numero_do_talao, atributo_falho, coluna)
			else
				raise e
			end
		end
	end
end