/**********************************************************************
 * LeechCraft - modular cross-platform feature rich internet client.
 * Copyright (C) 2012       Eugene Mamin
 * Copyright (C) 2006-2014  Georg Rudoy
 *
 * Boost Software License - Version 1.0 - August 17th, 2003
 *
 * Permission is hereby granted, free of charge, to any person or organization
 * obtaining a copy of the software and accompanying documentation covered by
 * this license (the "Software") to use, reproduce, display, distribute,
 * execute, and transmit the Software, and to prepare derivative works of the
 * Software, and to permit third-parties to whom the Software is furnished to
 * do so, all subject to the following:
 *
 * The copyright notices in the Software and this entire statement, including
 * the above license grant, this restriction and the following disclaimer,
 * must be included in all copies of the Software, in whole or in part, and
 * all derivative works of the Software, unless such copies or derivative
 * works are solely in the form of machine-executable object code generated by
 * a source language processor.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
 * SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
 * FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 **********************************************************************/

#include "fakeqwidgetwinapi.h"
#include <QDebug>
#include <objbase.h>

namespace LeechCraft
{
namespace Liznoo
{
namespace WinAPI
{
	FakeQWidgetWinAPI::FakeQWidgetWinAPI (QWidget *parent)
	: QWidget (parent)
	{
		hide ();
	}

	void FakeQWidgetWinAPI::prepareSchemeChange (PPOWERBROADCAST_SETTING setting)
	{
		const GUID newScheme =
			*reinterpret_cast<GUID*> (reinterpret_cast<DWORD_PTR> (setting->Data));

		QString scheme;
		if (GUID_MAX_POWER_SAVINGS == newScheme)
			scheme = tr ("Power saver");
		else if (GUID_MIN_POWER_SAVINGS == newScheme)
			scheme = tr ("High performance");
		else
			scheme = tr ("Balanced");

		emit schemeChanged (scheme);
	}

	void FakeQWidgetWinAPI::preparePowerSourceChange (PPOWERBROADCAST_SETTING setting)
	{
		const int nPowerSrc =
			*reinterpret_cast<int*> (reinterpret_cast<DWORD_PTR> (setting->Data));

		const QString& powerSource = nPowerSrc ? tr ("Battery") : tr ("AC");

		emit powerSourceChanged (powerSource);
	}

	void FakeQWidgetWinAPI::prepareBatteryStateChange (PPOWERBROADCAST_SETTING setting)
	{
		const int nPercentLeft =
			*reinterpret_cast<int*> (reinterpret_cast<DWORD_PTR> (setting->Data));

		emit batteryStateChanged (nPercentLeft);
	}

	void FakeQWidgetWinAPI::powerSettingsChanged (PPOWERBROADCAST_SETTING setting)
	{
		if (!setting)
		{
			qWarning()
					<< Q_FUNC_INFO
					<< "Null setting received";
			return;
		}
		if (sizeof (GUID) == setting->DataLength &&
			IsEqualGUID (setting->PowerSetting, GUID_POWERSCHEME_PERSONALITY))
			prepareSchemeChange (setting);
		else if (sizeof (int) == setting->DataLength &&
			IsEqualGUID (setting->PowerSetting, GUID_ACDC_POWER_SOURCE))
			preparePowerSourceChange (setting);
		else if (sizeof (int) == setting->DataLength &&
			IsEqualGUID (setting->PowerSetting, GUID_BATTERY_PERCENTAGE_REMAINING))
			prepareBatteryStateChange (setting);
	}

	bool FakeQWidgetWinAPI::nativeEvent (const QByteArray &eventType, void *msg, long *result)
	{
		static const QByteArray kGenericMSG { "windows_generic_MSG" };
		if (eventType != kGenericMSG)
			return QWidget::nativeEvent (eventType, msg, result);

		MSG *const message = reinterpret_cast<MSG *> (msg);

		if (message->message == WM_POWERBROADCAST && message->wParam == PBT_POWERSETTINGCHANGE)
			powerSettingsChanged (reinterpret_cast<PPOWERBROADCAST_SETTING> (message->lParam));

		return QWidget::nativeEvent (eventType, msg, result);
	}
}
}
}
