// STL includes
#include <iostream>

// QT includes
#include <QApplication>
#include <QDesktopWidget>
#include <QPixmap>
#include <QFile>
#include <QRgb>
#include <QScreen>

#include <QElapsedTimer>

// Utils includes
#include <utils/Image.h>
#include <utils/ColorRgb.h>

void createScreenshot(const int cropHorizontal, const int cropVertical, const int decimation, Image<ColorRgb> & image)
{
	// Create the full size screenshot
	QScreen *screen = QApplication::primaryScreen();
	const QRect screenSize = screen->availableGeometry();
	const int croppedWidth  = screenSize.width()  - 2*cropVertical;
	const int croppedHeight = screenSize.height() - 2*cropHorizontal;
	const QPixmap fullSizeScreenshot = screen->grabWindow(QApplication::desktop()->winId(), cropVertical, cropHorizontal, croppedWidth, croppedHeight);

	// Scale the screenshot to the required size
	const int width  = fullSizeScreenshot.width()/decimation;
	const int height = fullSizeScreenshot.height()/decimation;
	const QPixmap scaledScreenshot = fullSizeScreenshot.scaled(width, height, Qt::IgnoreAspectRatio, Qt::FastTransformation);

	// Convert the QPixmap to QImage in order to get out RGB values
	const QImage qImage = scaledScreenshot.toImage();

	// Make sure that the output image has the right size
	image.resize(width, height);

	// Copy the data into the output image
	for (int y=0; y<qImage.height(); ++y)
	{
		for (int x=0; x<qImage.width(); ++x)
		{
			// Get the pixel at [x;y] (format int32 #AARRGGBB)
			const QRgb inPixel = qImage.pixel(x,y);

			// Copy the color channels into the output pixel
			ColorRgb & outPixel = image(x,y);
			outPixel.red   = (inPixel & 0x00ff0000) >> 16;
			outPixel.green = (inPixel & 0x0000ff00) >>  8;
			outPixel.blue  = (inPixel & 0x000000ff);
		}
	}
}

int main(int argc, char** argv)
{
	int decimation = 10;

	QApplication app(argc, argv);
	QElapsedTimer timer;

	Image<ColorRgb> screenshot(64,64);

	int loopCnt = 100;
	timer.start();
	for (int i=0; i<loopCnt; ++i)
	{
		createScreenshot(0,0, decimation, screenshot);
	}
	std::cout << "Time required for single screenshot: " << timer.elapsed()/loopCnt << "ms" << std::endl;

	return 0;
}