require 'active_support/concern'

module Tcm::LicitanteConcern extend ActiveSupport::Concern
  # LT______.LCO"
  # Arquivo 505
  def pesquisa_licitantes
    pessoa_do_projeto_ids = []
    Licitacao::ConfiguracaoSimDoProjeto.where('data_de_envio BETWEEN ? AND ?', self.lote.data_referencia, self.lote.data_referencia.end_of_month).each do |configuracao_sim|

      processo_id = configuracao_sim.projeto_id

      pessoas = Licitacao::PessoaDoProjeto.joins(projeto: [unidades_orcamentarias_por_pedido: [unidade_orcamentaria: :tipo_de_unidade_administrativa]])
        .where('licitacao_projetos.envia_pro_sim is TRUE AND licitacao_projetos.id = ?', processo_id)
        .where('base_tipos_de_unidades_administrativas.poder_associado = ?',self.lote.poder_associado)
        .where('licitacao_pessoas_do_projeto.arquivo_id is NULL OR licitacao_pessoas_do_projeto.arquivo_id = ?', self.id)
        .where('licitacao_projetos.data_de_envio_pro_sim BETWEEN ? AND ?', self.lote.data_referencia, self.lote.data_referencia.end_of_month)
        .where('licitacao_projetos.modalidade_do_processo != ? AND licitacao_projetos.status = ?', Licitacao::Projeto.modalidades_do_processo[:parceria_osc], Licitacao::Projeto.status[:homologado]).distinct.all

      pessoas.each do |pessoa|
        pessoa_do_projeto_ids << pessoa.id
      end
    end

    Licitacao::PessoaDoProjeto.where('id in (?)', pessoa_do_projeto_ids)
  end

  def gera_arquivo_licitantes
    conteudo = ''
    licitantes = pesquisa_licitantes

    licitantes.each do |licitante|
      conteudo << licitante_to_sim(licitante) << "\r\n"
      licitante.update_column(:arquivo_id, self.id)
    end
    self.update_columns(conteudo:conteudo, classe:'Licitacao::PessoaDoProjeto')
  end

  def licitante_to_sim(licitante)
    begin
      licitante.valida_pessoa_juridica
      licitante.valida_cep_pessoa

      texto = ""
      texto << "505".to_s.sim_preenche(3) + ","
      texto << Configuracao.first.codigo_do_municipio_no_tcm.to_s.sim_preenche(3) + ","
      texto << licitante.projeto.data_de_autuacao.sim_data + ","
      texto << licitante.projeto.numero_do_processo.sim_limite(15) + ","
      texto << (licitante.pessoa.pessoa_juridica? ? "1" : "2").sim_limite(1) + ","
      texto << (licitante.pessoa.pessoa_juridica? ? licitante.pessoa.cnpj : licitante.pessoa.cpf).sim_limite(25) + ","
      texto << licitante.pessoa.nome.sim_limite(59) + ","
      texto << licitante.pessoa.endereco_completo.gsub(/["\r\n]/, "").sim_limite(255) + ","
      texto << (licitante.pessoa.telefone.nil? ? "" : licitante.pessoa.telefone.gsub(/[^\d]/, '')).sim_limite(11) + ","
      texto << (licitante.pessoa.cep.nil? ? "" : licitante.pessoa.cep).sim_limite(8) + ","
      texto << licitante.pessoa.cidade.nome.sim_limite(30) + ","
      texto << licitante.pessoa.cidade.estado.uf.sim_limite(2) + ","
      texto << (self.try(:lote).present? ? self.lote.exercicio_e_mes_de_geracao : self.exercicio_e_mes_de_geracao).to_s

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