class EnviarEmailsDeVigenciaDeContratosJob < ActiveJob::Base
	queue_as :default

	def perform(*args)
		puts "==="
		puts "Iniciando - Envio de Email sobre Vigência de Contratos"
		aditivo_confirmado = "1"
		if Configuracao.first.permite_enviar_alertas
			clausula_query = "(
				licitacao_aditivos.fim_da_vigencia is not null AND
				(
					(SELECT MAX(fim_da_vigencia) FROM licitacao_aditivos WHERE contrato_id = licitacao_contratos.id AND fim_da_vigencia IS NOT NULL AND status = #{aditivo_confirmado}) = :em_60_dias
					OR
					(SELECT MAX(fim_da_vigencia) FROM licitacao_aditivos WHERE contrato_id = licitacao_contratos.id AND fim_da_vigencia IS NOT NULL AND status = #{aditivo_confirmado}) = :em_30_dias
					OR
					(SELECT MAX(fim_da_vigencia) FROM licitacao_aditivos WHERE contrato_id = licitacao_contratos.id AND fim_da_vigencia IS NOT NULL AND status = #{aditivo_confirmado}) = :em_15_dias
					OR
					(SELECT MAX(fim_da_vigencia) FROM licitacao_aditivos WHERE contrato_id = licitacao_contratos.id AND fim_da_vigencia IS NOT NULL AND status = #{aditivo_confirmado}) = :em_5_dias
				)
			) OR (
				licitacao_aditivos.fim_da_vigencia IS NULL AND
				(
					licitacao_contratos.fim_da_vigencia = :em_60_dias
					OR
					licitacao_contratos.fim_da_vigencia = :em_30_dias
					OR
					licitacao_contratos.fim_da_vigencia = :em_15_dias
					OR
					licitacao_contratos.fim_da_vigencia = :em_5_dias
				)
			)"
			contratos_validos = Licitacao::Contrato.fechado.left_joins(:aditivos).where(clausula_query, em_60_dias: Date.today+60.day, em_30_dias: Date.today+30.day, em_15_dias: Date.today+15.day, em_5_dias: Date.today+5.day).distinct

			usuarios_e_contratos = Hash.new
			contratos_validos.sort_by {|c| c.data_final_de_acordo_com_aditivos }
			if contratos_validos.count > 0
				puts "Há #{contratos_validos.count} contratos válidos para o job. Iniciando busca por usuários"
				contratos_validos.each do |contrato|
					contrato.unidade_orcamentaria.usuarios.where(receber_email: true).each do |usuario|
						if !usuario.nil?
							if !usuarios_e_contratos.has_key?(usuario.id)
								usuarios_e_contratos[usuario.id] = {em_5: Set.new, em_15: Set.new, em_30: Set.new, em_60: Set.new}
							end
						end
						usuarios_e_contratos[usuario.id] = separador_de_emails(contrato, usuarios_e_contratos[usuario.id])
					end
				end
				if usuarios_e_contratos.count > 0
					puts "Preparando envio de e-mail para #{usuarios_e_contratos.count} usuário(s)"
					usuarios_e_contratos.each do |usuario_id, correspondencias|
						titulo = "Há um ou mais Contratos perto do final da vigência"
						conteudo = "<p>O sistema detectou que há um ou mais contratos próximos do final de sua vigência<p>"
						correspondencias.each do |dias, contratos|
							unless contratos.blank?
								conteudo += "<p><strong>Em #{dias.to_s.gsub("em_", "")} dias:</strong></p>"
								conteudo += "<ul>"
								contratos.each do |contrato|
									conteudo += "<li><a href='#{url_aplicacao}/licitacao/contratos/#{contrato[:id].to_s}' target='_blank'>#{ contrato[:numero].to_s }</a> de fornecedor #{ contrato[:fornecedor] }</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á #{contratos_validos.count} contratos válidos, mas nenhum usuário que as receba. Encerrando..."
				end
			else
				puts "Nenhum contrato 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 Contratos"
	end

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

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