/*
 * Copyright (c) 2015 Tricoire Sebastien 3dsman@free.fr
 *
 * This software is provided 'as-is', without any express or implied
 * warranty.  In no event will the authors be held liable for any damages
 * arising from the use of this software.
 *
 * Permission is granted to anyone to use this software for any purpose,
 * including commercial applications, and to alter it and redistribute it
 * freely, subject to the following restrictions:
 *
 * 1. The origin of this software must not be misrepresented; you must not
 * claim that you wrote the original software. If you use this software
 * in a product, an acknowledgment in the product documentation would be
 * appreciated but is not required.
 * 2. Altered source versions must be plainly marked as such, and must not be
 * misrepresented as being the original software.
 * 3. This notice may not be removed or altered from any source distribution.
 *
 */

#include "OE_io.h"
#include "OE_document.h"
#include "stitchs/OE_birailstitch.h"
#include "stitchs/OE_linestitch.h"
#include "stitchs/OE_linkstitch.h"
#include "stitchs/OE_fillstitch.h"
#include "stitchs/OE_staticstitch.h"
#include "OE_utils.h"
#include <iostream>
#include <fstream>

#include <QImage>
#include <QPainter>
#include <QPen>
#include <QImageWriter>

static bool saveToJPG(const OE_document* document, std::string path);

extern const OE_io ioJpg;
const OE_io ioJpg = {"jpg",
                    "Jpg",
                    nullptr,
                    saveToJPG};

static inline QPointF transformPoint(const vector_2d& pt, const vector_2d& offset, float scale)
{
	vector_2d newPt = (pt - offset) * scale;
	return QPointF(newPt.x, newPt.y);
}

static bool saveToJPG(const OE_document* document, std::string path)
{
	const int maxsize = 512;
	const int quality = 90;

	int w,h;
	float scale;
	BoundingBox bb = document->getBound();
	vector_2d ptMin = bb.getMin();
	if (bb.getMax().y-bb.getMin().y <= bb.getMax().x-bb.getMin().x)
	{
		w = maxsize;
		h = w * (bb.getMax().y-bb.getMin().y) / (bb.getMax().x-bb.getMin().x) + 0.5f;
		scale = maxsize / (bb.getMax().x-bb.getMin().x);
	}
	else
	{
		h = maxsize;
		w = h * (bb.getMax().x-bb.getMin().x) / (bb.getMax().y-bb.getMin().y) + 0.5f;
		scale = maxsize / (bb.getMax().y-bb.getMin().y);
	}

	QImage image(w, h, QImage::Format_RGB888);
	image.fill(Qt::white);
	QPainter painter(&image);
	painter.setRenderHint(QPainter::RenderHint::Antialiasing);

	for (OE_stitchs* stitch : document->stitchs)
	{
		if (stitch->getPoints().empty() || dynamic_cast<OE_linkstitch*>(stitch))
		{
			continue;
		}
		QPointF lastPoint = transformPoint(stitch->getPoints()[0], ptMin, scale);
		OE_color oecol = stitch->getThread()->getColor();
		QPen pen(QColor(oecol.rgba[0]*255,oecol.rgba[1]*255,oecol.rgba[2]*255,255));
		painter.setPen(pen);
		if (stitch->getNpts()==1)
		{
			painter.drawPoint(lastPoint);
		}
		else
		{
			for (ssize_t i=1; i<stitch->getNpts(); i++)
			{
				QPointF newPoint = transformPoint(stitch->getPoints()[i], ptMin, scale);
				painter.drawLine(lastPoint, newPoint);
				lastPoint = newPoint;
			}
		}
	}

	painter.end();
	QImageWriter writer(QString::fromStdString(path));
	writer.setQuality(quality);
	writer.write(image);

	return true;
}










