class EnviarEmailsDeContratosEncerradosJob < ActiveJob::Base
  queue_as :default

	def perform(*args)
		puts "==="
		puts "Iniciando - Envio de Email sobre Contratos Encerrados"
		if Configuracao.first.permite_enviar_alertas
			aditivo_confirmado = "1"
			contratos_encerrados = Licitacao::Contrato.fechado.left_joins(:aditivos).where("
				(
					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 =  ?
						) = ?
					)
				)
				OR
				(
					licitacao_aditivos.fim_da_vigencia IS NULL AND licitacao_contratos.fim_da_vigencia = ?
				)", aditivo_confirmado, Date.today - 1.day, Date.today - 1.day).distinct
			usuarios_e_contratos = Hash.new
			contratos_encerrados.sort_by {|c| c.data_final_de_acordo_com_aditivos }
			if contratos_encerrados.count > 0
				puts "Há #{contratos_encerrados.count} contratos válidos para o job. Iniciando busca por usuários"
				contratos_encerrados.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] = Set.new
							end
						end
						if !usuarios_e_contratos[usuario.id].include?({id: contrato.id, numero: contrato.numero, fornecedor: contrato.try(:pessoa_do_projeto).try(:empresa_nome) })
							usuarios_e_contratos[usuario.id] << {id: contrato.id, numero: contrato.numero, fornecedor: contrato.try(:pessoa_do_projeto).try(:empresa_nome) }
						end
					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 que tiveram vigência encerrada"
						conteudo = "<p>O sistema detectou que há um ou mais contratos que tiveram vigência encerrada ontem<p>"
						conteudo += "<ul>"
						correspondencias.each do |contrato|
							unless contrato.blank?
								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
						end
						conteudo += "</ul>"
						Comunicacao::Mensagem.create(titulo: titulo, conteudo: conteudo, usuarios: Usuario.where(id: usuario_id).to_a, deliver_now: true)
					end
				else
					puts "Há #{contratos_encerrados.count} contratos encerrados ontem, mas nenhum usuário que as receba. Encerrando..."
				end
			else
				puts "Nenhum contrato encerrado ontem"
			end
		else
			puts "Sistema setado para não enviar alertas. Encerrando..."
		end
		puts "Concluindo - Envio de Email sobre Contratos Encerrados"
  end

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