// Copyright (c) 2014 Alex Diener. All rights reserved.

#ifndef __GameSession_H__
#define __GameSession_H__
#ifdef __cplusplus
extern "C" {
#endif

typedef struct GameSession GameSession;

#define BUILT_IN_LEVEL_SET_COUNT 4
#define LEVEL_SET_COUNT_MAX 28

#include "dynamictypes/AssociativeArray.h"
#include "inputcontroller/InputMap.h"
#include "preferences/Preferences.h"
#include "resourcemanager/ResourceManager.h"
#include "stemobject/StemObject.h"
#include "utilities/EventDispatcher.h"
#include "watertowerclassic/LevelSetModel.h"

#define GameSession_structContents(self_type) \
	StemObject_structContents(self_type) \
	\
	Preferences * preferences; \
	InputMap * inputMap; \
	ResourceManager * resourceManager; \
	AssociativeArray * importedLevelNames; \
	LevelSetModel ** levelSets; \
	unsigned int levelSetCount; \
	unsigned int selectedLevelSetIndex; \
	LevelSetModel * levelSet; \
	unsigned int startLevelIndex; \
	bool testingLevel; \
	bool viewingSettingsFromGameplay; \
	bool hasUnsavedLevelChanges;

stemobject_struct_definition(GameSession)

GameSession * GameSession_create();
bool GameSession_init(GameSession * self);
void GameSession_dispose(GameSession * self);

void GameSession_saveControlBindings(GameSession * self);
void GameSession_savePreferences(GameSession * self);
void GameSession_addLevelSet(GameSession * self, LevelSetModel * levelSet);
void GameSession_deleteLevelSet(GameSession * self, unsigned int levelSetIndex);
void GameSession_replaceLevelSetAtIndex(GameSession * self, unsigned int levelSetIndex, LevelSetModel * levelSet);
void GameSession_levelSetNameUpdated(GameSession * self, unsigned int levelIndex);

#ifdef __cplusplus
}
#endif
#endif
