/**********************************************************************
 * LeechCraft - modular cross-platform feature rich internet client.
 * Copyright (C) 2006-2012  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 "dockutil.h"
#include <numeric>

#import <AppKit/NSDockTile.h>
#import <AppKit/NSColor.h>
#import <Foundation/NSString.h>
#import "lcbadgeview.h"

namespace
{
	LCBadgeView* GetBadgeView ()
	{
		static LCBadgeView *view = nullptr;
		if (view)
			return view;

		NSDockTile *dockTile = [NSApp dockTile];
		NSView *contentView = [dockTile contentView];
		NSSize size = contentView ? [contentView bounds].size : [dockTile size];

		view = [[LCBadgeView alloc] initWithFrame: NSMakeRect (0, 0, size.width, size.height)];
		[dockTile setContentView: view];
		[dockTile display];

		return view;
	}

	static NSString* toNsString (const QString& text)
	{
		const auto& ba = text.toUtf8 ();
		return [NSString stringWithUTF8String: ba.constData ()];
	}
}

namespace LeechCraft
{
namespace AdvancedNotifications
{
namespace Dolle
{
namespace DU
{
	void InstallBadgeView ()
	{
		GetBadgeView ();
	}

	bool SetDockBadges (const QList<NotificationData>& badges)
	{
		typedef QList<QPair<QString, QColor>> BadgePairs;

		auto view = GetBadgeView ();
		if (!view)
			return false;

		BadgePairs badgePairs;

		auto badgesCount = std::count_if (badges.constBegin (), badges.constEnd (),
				[] (const NotificationData& d) { return d.Total_ > 0; });

		if (badgesCount > [view maxBadges])
		{
			const auto total = std::accumulate (badges.constBegin (), badges.constEnd (), 0,
					[] (int s, const NotificationData& d) { return s + d.Total_; });

			badgePairs.append ({ QString::number (total), QColor (Qt::red) });
			badgesCount = 1;
		}
		else
		{
			for (const NotificationData& data: badges)
			{
				const auto total = std::accumulate (data.Counts_.constBegin (), data.Counts_.constEnd (), 0);
				if (!total)
					continue;

				badgePairs.append ({ QString::number (total), data.Color_ });
			}
		}
		NSMutableArray *labelsArray = [NSMutableArray arrayWithCapacity: badgesCount];
		NSMutableArray *colorsArray = [NSMutableArray arrayWithCapacity: badgesCount];
		for (const auto& b : badgePairs)
		{
			[labelsArray addObject: toNsString (b.first)];
			[colorsArray addObject: [NSColor colorWithCalibratedRed:b.second.redF ()
															  green:b.second.greenF ()
															   blue:b.second.blueF ()
															  alpha:b.second.alphaF ()]];
		}

		return [view displayBadges: labelsArray andColors: colorsArray] == YES;
	}
}
}
}
}
