/*
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at https://mozilla.org/MPL/2.0/.
 */

#include "ThreadBackgroundSleep.hpp"
#include "Logger.hpp"
#include "AppEvents.hpp"

namespace OpenVulkano
{
	ThreadBackgroundSleep ThreadBackgroundSleep::INSTANCE;

	ThreadBackgroundSleep::ThreadBackgroundSleep()
	{
		m_resignHandler = AppEvents::OnWillResignActive += [this]() { m_inBackground = true;  };
		m_resumeHandler = AppEvents::OnDidBecomeActive  += [this]() { Resume(); };
	}

	ThreadBackgroundSleep::~ThreadBackgroundSleep()
	{
		AppEvents::OnWillResignActive -= m_resignHandler;
		AppEvents::OnDidBecomeActive -= m_resumeHandler;
		Resume();
	}

	void ThreadBackgroundSleep::Resume()
	{
		{
			std::unique_lock lock(m_mutex);
			m_inBackground = false;
		}
		m_condVar.notify_all();
	}

	void ThreadBackgroundSleep::CheckForBackground(std::string_view taskName)
	{
		if (m_inBackground)
		{
			Logger::MANAGER->info("Sleep {}, because app has been sent to background.", taskName);
			std::unique_lock l(m_mutex);
			m_condVar.wait(l, [this]{ return !m_inBackground; });
			Logger::MANAGER->info("Resume {}, app is no longer in background.", taskName);
		}
	}
}