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

#ifndef __GameSession_H__
#define __GameSession_H__

typedef struct GameSession GameSession;
#define GameSession_superclass StemObject

#define BUILT_IN_LEVEL_SET_COUNT 4
#define LEVEL_SET_COUNT_MAX 28

#define PREFERENCE_KEY_PLAY_SOUND       "play_sound"
#define PREFERENCE_KEY_PLAY_MUSIC       "play_music"
#define PREFERENCE_KEY_INTEGER_SCALE    "integer_scale"
#define PREFERENCE_KEY_LINEAR_FILTER    "linear_filter"
#define PREFERENCE_KEY_FULL_SCREEN      "fullscreen"
#define PREFERENCE_KEY_VSYNC_WINDOW     "vsync_window"
#define PREFERENCE_KEY_VSYNC_FULLSCREEN "vsync_fullscreen"
#define PREFERENCE_KEY_INPUT_MAP        "input_map"
#define PREFERENCE_KEY_IMPORTED_LEVELS  "imported_levels"

#include "dynamictypes/DataAssociativeArray.h"
#include "dynamictypes/DataValueSchema.h"
#include "inputcontroller/GamepadMap.h"
#include "inputcontroller/InputMap.h"
#include "preferences/Preferences.h"
#include "stemobject/StemObject.h"
#include "utilities/EventDispatcher.h"
#include "watertowerclassic/LevelSetModel.h"

#define GameSession_ivars \
	StemObject_ivars \
	\
	Preferences * preferences; \
	DataValueSchema * preferencesSchema; \
	GamepadMap * gamepadMap; \
	InputMap * inputMap; \
	DataAssociativeArray * importedLevelNames; \
	LevelSetModel ** levelSets; \
	unsigned int levelSetCount; \
	unsigned int selectedLevelSetIndex; \
	LevelSetModel * levelSet; \
	unsigned int startLevelIndex; \
	bool testingLevel; \
	bool viewingSettingsFromGameplay; \
	bool hasUnsavedLevelChanges;

#define GameSession_vtable(self_type) \
	StemObject_vtable(self_type)

stemobject_declare(GameSession)

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

void GameSession_saveControlBindings(GameSession * self);
bool 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);

#endif
