require 'active_support/concern'

module Tcm::TalaoDeReceitaConcern extend ActiveSupport::Concern
  # TR______.DCR
	# ARQUIVO 401

  def pesquisa_taloes_de_receitas
		Contabilidade::ComplementoPorFonteDoTalaoDeReceita.joins(talao_de_receita: [unidade_orcamentaria: :tipo_de_unidade_administrativa])
    .where('base_tipos_de_unidades_administrativas.poder_associado = ?', self.lote.poder_associado)
    .where('contabilidade_complementos_por_fonte_do_talao_de_receita.arquivo_id is null OR contabilidade_complementos_por_fonte_do_talao_de_receita.arquivo_id = ?', self.id)
    .where('contabilidade_taloes_de_receita.origem_do_talao = 0 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
    conteudo = ''
		complementos_por_fonte_do_talao = pesquisa_taloes_de_receitas

		complementos_por_fonte_do_talao.each do |complemento|
			if complemento.valor.to_f != 0
				conteudo << talao_de_receita_to_sim(complemento)
				conteudo << "\r\n"
				complemento.update_column(:arquivo_id, self.id)
			end
		end
    self.update_columns(conteudo:conteudo, classe:'Contabilidade::ComplementoPorFonteDoTalaoDeReceita')
	end

  def talao_de_receita_to_sim(complemento)
    # váriaveis para gerar o SIM

    talao = complemento.talao_de_receita

    numero_da_agencia = talao.conta_bancaria_por_unidade_orcamentaria.conta_bancaria.agencia.numero_da_agencia.to_s.delete("-").first(4) rescue nil
    numero_da_agencia = numero_da_agencia.present? ? numero_da_agencia.sim_preenche(6) : '""'

    numero_da_conta = talao.conta_bancaria_por_unidade_orcamentaria.conta_bancaria.numero_da_conta.gsub("-",'').gsub(".",'') rescue nil
    if numero_da_conta.present?
      if numero_da_conta.size < 10
        numero_da_conta = numero_da_conta.insert(0, "0" * (10 - numero_da_conta.size)).sim_limite(10)
      else
        numero_da_conta = numero_da_conta.sim_limite(10)
      end
    else
      numero_da_conta = "9999999999".sim_limite(10)
    end

    codigo_da_fonte_de_recurso =  complemento.orcamento_da_receita.try(:fonte_de_recursos).try(:codigo_completo).to_s
    codigo_da_fonte_de_recurso.try(:slice!, 0)

		begin
			texto = ""
			texto << "401".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.to_s.codigo_uo_to_sim + "," #5

			# o sim exige 15 digitos, foi pedido para tirar os 2 zeros da frente e por 1 atrás
			texto << (talao.natureza_da_receita.codigo.to_s.last(-2) + '0').sim_preenche_a_direita(15) + "," #6  
			texto << complemento.orcamento_da_receita.try(:fonte_de_recursos).try(:codigo_completo).to_s.sim_limite(1) + "," #7
			texto << codigo_da_fonte_de_recurso.to_s.sim_limite(9) + "," #8
			texto << talao.numero_do_talao.to_s.sim_limite(8) + ","#9
			texto << talao.data_do_talao.sim_data + ","#10
			texto << (self.try(:lote).present? ? self.lote.exercicio_e_mes_de_geracao : self.exercicio_e_mes_de_geracao).to_s + "," #11
      texto << complemento.valor.to_f.to_s.sim_valor + "," #12
			texto << talao.historico.sim_descricao.sim_limite(255) + "," #13
			texto << talao.pessoa.tipo_pessoa_to_sim.sim_limite(1) + "," #14
			texto << complemento.documento_de_identificao.to_s.tr('./-', '').sim_limite(25) + "," #15
			texto << talao.pessoa.nome.to_s.strip.sim_limite(60) + "," #16
			texto << (talao.conta_bancaria_por_unidade_orcamentaria.conta_bancaria.agencia.banco.numero_do_banco.to_s.sim_preenche(4) rescue "9999" ) + "," #17
			texto << numero_da_agencia + "," #18
			texto << numero_da_conta + "," #19
			texto << complemento.documento_de_identificao.to_s.tr('./-', '').sim_limite(20) + "," #20
			texto << talao.data_do_talao.sim_data + "," #21
			texto << talao.read_attribute_before_type_cast(:tipo_de_documento).to_s + "," #22
			texto << complemento.read_attribute_before_type_cast(:complementacao_da_fonte_de_recurso).to_s.sim_preenche(4) #23

			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(complemento, "", atributo_falho, coluna)
			else
				raise e
			end
		end
	end
end