#pragma once

#include <string>
#include <vector>

namespace ZL::Quest {

enum class QuestStatus {
	Hidden,
	Available,
	Active,
	Completed,
	Failed
};

enum class QuestCategory {
	Main,
	Side,
	Contract,
	Tutorial
};

struct QuestObjective {
	std::string id;
	std::string text;
	bool completed = false;
};

struct QuestDefinition {
	std::string id;
	std::string title;
	std::string description;
	QuestCategory category = QuestCategory::Side;
	QuestStatus initialStatus = QuestStatus::Hidden;
	int recommendedLevel = 0;
	std::vector<QuestObjective> objectives;
};

struct QuestState {
	QuestDefinition definition;
	QuestStatus status = QuestStatus::Hidden;
	int activeObjectiveIndex = 0;
	int orderIndex = 0; // acquisition/load order; larger value means newer quest
};

const char* toString(QuestStatus status);
const char* toString(QuestCategory category);

} // namespace ZL::Quest
