class EnviarEmailsDeVigenciaDeAtasJob < ActiveJob::Base
	queue_as :default

	def perform(*args)
		puts "==="
		puts "Iniciando - Envio de Email sobre Vigência de Atas"
		if Configuracao.first.permite_enviar_alertas
			atas_validas = Licitacao::AtaDeRegistroDePrecos.where("(data_final_de_vigencia = :em_60 OR data_final_de_vigencia = :em_30 OR data_final_de_vigencia = :em_15 OR data_final_de_vigencia = :em_5) AND status = :confirmado", em_60: Date.today+60.day, em_30: Date.today+30.day, em_15: Date.today+15.day, em_5: Date.today+5.day, confirmado: Licitacao::AtaDeRegistroDePrecos.status[:confirmado]).order(:data_final_de_vigencia).distinct
			if atas_validas.count > 0
				usuarios_e_atas = Hash.new
				puts "Há #{atas_validas.count} atas válidas para o job. Iniciando busca por usuários"
				atas_validas.each do |ata|
					ata.unidades_orcamentarias.each do |unidade_orcamentaria|
						unidade_orcamentaria.usuarios.where(receber_email: true).each do |usuario|
							if !usuario.nil?
								if !usuarios_e_atas.has_key?(usuario.id)
									usuarios_e_atas[usuario.id] = {em_5: Set.new, em_15: Set.new, em_30: Set.new, em_60: Set.new}
								end
							end
							usuarios_e_atas[usuario.id] = separador_de_emails(ata, usuarios_e_atas[usuario.id])
						end
					end
				end
				if usuarios_e_atas.count > 0
					puts "Preparando envio de e-mail para #{usuarios_e_atas.count} usuário(s)"
					usuarios_e_atas.each do |usuario_id, correspondencias|
						titulo = "Há uma ou mais Atas de Registro de Preço perto do final da vigência"
						conteudo = "<p>O sistema detectou que há uma ou mais Atas de Registro de Preço próximas do final de sua vigência<p>"
						correspondencias.each do |dias, atas|
							unless atas.blank?
								conteudo += "<p><strong>Em #{dias.to_s.gsub("em_", "")} dias:</strong></p>"
								conteudo += "<ul>"
								atas.each do |ata|
									conteudo += "<li><a href='#{url_aplicacao}/licitacao/atas_de_registro_de_precos/#{ata[:id].to_s}' target='_blank'>#{ ata[:numero].to_s }</a></li>"
								end
								conteudo += "</ul>"
							end
						end
						Comunicacao::Mensagem.create(titulo: titulo, conteudo: conteudo, usuarios: Usuario.where(id: usuario_id).to_a, deliver_now: true)
					end
				else
					puts "Há #{atas_validas.count} atas válidas, mas nenhum usuário que as receba. Encerrando..."
				end
			else
				puts "Nenhuma ata com fim de vigência em 5, 15, 30 ou 60 dias"
			end
		else
			puts "Sistema setado para não enviar alertas. Encerrando..."
		end
		puts "Concluindo - Envio de Email sobre Vigência de Atas"
	end

	def url_aplicacao
		municipio = ENV["municipio"].blank? ? "" : "/#{ENV['municipio']}"
		host = ENV["host"].blank? ? "" : "#{ENV['host']}"
		host + municipio
	end

	def separador_de_emails(ata, correspondencias)
		if ata.data_final_de_vigencia == Date.today+5.day && !correspondencias[:em_5].include?({id: ata.id, numero: ata.numero})
				correspondencias[:em_5] << {id: ata.id, numero: ata.numero}
		elsif ata.data_final_de_vigencia == Date.today+15.day && !correspondencias[:em_15].include?({id: ata.id, numero: ata.numero})
			correspondencias[:em_15] << {id: ata.id, numero: ata.numero}
		elsif ata.data_final_de_vigencia == Date.today+30.day && !correspondencias[:em_30].include?({id: ata.id, numero: ata.numero})
			correspondencias[:em_30] << {id: ata.id, numero: ata.numero}
		elsif ata.data_final_de_vigencia == Date.today+60.day && !correspondencias[:em_60].include?({id: ata.id, numero: ata.numero})
			correspondencias[:em_60] << {id: ata.id, numero: ata.numero}
		end
		correspondencias
	end
end