/*
* This file is part of project OpenEmbroidery. It's copyrighted by
* the contributors recorded in the version control history of the file.
* Original project location https://code.electrolab.fr/openEmbroidery/openEmbroidery_software
*
* SPDX-License-Identifier: CECILL-2.1
* License-Filename: Licence_CeCILL_V2.1-en.txt
*/

#pragma once

#include "OE_utils.h"
#include <stdint.h>
#include <vector>
#include "OE_document.h"
#include "OE_display.h"
//#include "OE_editDisplay.h"
//#include "OE_commandDisplay.h"

#include "curves/OE_joincurve.h"
#include "curves/OE_subcurve.h"
//#include <GLFW/glfw3.h>

class OE_interfaceDisplay : public OE_display
{
	public:

		/** Default constructor */
		OE_interfaceDisplay(QWidget* parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags());
		/** Default destructor */
		virtual ~OE_interfaceDisplay();

		virtual bool setDocument(OE_document* document);
		virtual bool setController(OE_controller* controller);

		virtual void showAll();

		virtual bool mouse_Pos(double x, double y);
		virtual bool mouse_Button(QMouseEvent* event);
		virtual void scroll(double xoffset, double yoffset);
		virtual void resize(int width, int height);
		virtual void key(QKeyEvent* event);

        bool checkJoinCurveControl(OE_joincurve* joinCurve, int &index);
        bool pickingTool(int toolType, int toolIndex);
        bool pickingMoveTool();
        bool pickingScaleTool();
        bool pickingStitch(int stitchIndex);
        bool pickingStitchControl(int stitchIndex, int ctrlType, int ctrlIndex);
        bool pickingCurve(int curveIndex);
        bool pickingCurveControl(int curveIndex, int ctrlType, int ctrlIndex);
		bool drawPicking();
		void selectBox();
		bool selectApply(std::list<OE_pointcurve*> selectedCurves, std::list<OE_stitchs*> selectedStitches);
		bool draw();

	private:
		enum screen
		{
			edit,
			command,
		};

		enum State
		{
			None,
			Selection,
			MoveSelection,
			ScaleSelection,
			AddSubcurve,
			NewSubcurve,
			TraceSubcurve,
			MoveSubcurve,
			MovePointcurve,
			MovePointstitch,
			DelPointstitch,
			OffsetWidthLinestitch,
			ScaleLenLinestitch,
		};

		OE_display::OE_displayStyle* editStyle = NULL;
		OE_display::OE_displayStyle* commandStyle = NULL;

		//OE_display* curDisplay = NULL;
		screen curScreen = edit;

		std::list<OE_pointcurve*> selectedCurves;
		std::list<OE_stitchs*> selectedStitches;

		Qt::KeyboardModifiers modState;
		bool changeDpi = true;
		vector_2d clicOldMouse;
		//bool selection = false;

		State editionState = None;
		int joincurve_id = 0;
		OE_curve* closestCurve = 0;
		OE_joincurve* curJoincurve = 0;
		int subcurve_id = -1;
		OE_subcurve* editSubcurve = 0;
		vector_2dt editClosestPoint;

		OE_stitchs* selControlStitch = 0;
		OE_curve* selControlCurve = 0;
		int selControlType = 0;
		int selControlIndex = 0;

		int toolAction = 0;

		bool run;
};

