/*
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at https://mozilla.org/MPL/2.0/.
 */

#pragma once

#include "GesturePan.hpp"
#include "GesturePinch.hpp"
#include "GestureTap.hpp"
#include <functional>
#include <memory>
#include <vector>

namespace OpenVulkano::Input
{
	class GestureProcessor final
	{
		friend class InputDeviceTouch;

		GesturePan m_gesturePan;
		GesturePan m_gesturePanTwoFingers;
		GesturePinch m_gesturePinch;
		GestureTap m_gestureTap;
		GestureTap m_gestureTapTwoFingers; // TODO
		std::vector<Gesture*> m_gestures;

	public:
		GestureProcessor();
		~GestureProcessor();

		void Init();
		void Close();

		void AddGesture(Gesture* gesture);
		void RemoveGesture(Gesture* gesture);
		bool ResolveConflicts(Gesture* gesture);
		void Reset();

		void TouchDown(const Touch& touch);
		void TouchUp(const Touch& touch);

		void TouchMoved(const Touch& touch);

		//region conflict resolution
		enum class ConflictResult
		{
			NeitherGesture,
			ExistingGesture,
			NewGesture,
			BothGestures
		};

		using ConflictResolutionDelegate = std::function<ConflictResult(const Gesture*, const Gesture*)>;

		void SetConflictResolutionDelegate(const ConflictResolutionDelegate& delegate) { m_conflictResolutionDelegate = delegate; }

	private:
		ConflictResolutionDelegate m_conflictResolutionDelegate;
		//endregion
	};
}