#pragma once
#include "CppScripts.h"

struct ActivityTimer {
	std::string name;
	float_t updateInterval;
	float_t stopTime;
	float_t runTime = 0;
};

class ActivityManager : virtual public CppScripts::Script {
public:
	static bool IsPlayerInActivity(Entity* self, LWOOBJID playerID);
	static void UpdatePlayer(Entity* self, LWOOBJID playerID, bool remove = false);
	static void SetActivityScore(Entity* self, LWOOBJID playerID, uint32_t score);
	static void SetActivityValue(Entity* self, LWOOBJID playerID, uint32_t valueIndex, float_t value);
	static float_t GetActivityValue(Entity* self, LWOOBJID playerID, uint32_t valueIndex);
	static bool TakeActivityCost(const Entity* self, LWOOBJID playerID);
	static uint32_t GetActivityID(const Entity* self);
	void StopActivity(Entity* self, LWOOBJID playerID, uint32_t score, uint32_t value1 = 0, uint32_t value2 = 0, bool quit = false);
	void SaveScore(Entity* self, const LWOOBJID playerID, const float primaryScore, const float secondaryScore = 0.0f, const float tertiaryScore = 0.0f) const;
	virtual uint32_t CalculateActivityRating(Entity* self, LWOOBJID playerID);
	static void GetLeaderboardData(Entity* self, LWOOBJID playerID, uint32_t activityID, uint32_t numResults = 0);
	//    void FreezePlayer(Entity *self, const LWOOBJID playerID, const bool state) const;

		// Activity timer
	void OnTimerDone(Entity* self, std::string timerName) override;
	virtual void OnActivityTimerDone(Entity* self, const std::string& name) {};
	virtual void OnActivityTimerUpdate(Entity* self, const std::string& name, float_t timeRemaining, float_t elapsedTime) {};
	void ActivityTimerStart(Entity* self, const std::string& timerName, float_t updateInterval, float_t stopTime = -1.0f);
	void ActivityTimerReset(Entity* self, const std::string& timerName);
	void ActivityTimerStop(Entity* self, const std::string& timerName);
	void ActivityTimerStopAllTimers(Entity* self);
	float_t ActivityTimerGetRemainingTime(Entity* self, const std::string& timerName) const;
	float_t ActivityTimerGetCurrentTime(Entity* self, const std::string& timerName) const;
	int32_t GetGameID(Entity* self) const;
private:
	std::string GetPrefixedName(const std::string& name) const;
	[[nodiscard]] ActivityTimer* GetTimer(const std::string& name) const;
	std::vector<ActivityTimer*> activeTimers{};

	std::string TimerPrefix = "ActivityTimer";
};