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

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

typedef struct LevelEditorScreen LevelEditorScreen;

#include "glbitmapfont/GLBitmapFont.h"
#include "inputcontroller/InputController.h"
#include "screenmanager/Screen.h"
#include "watertowerclassic/GameSession.h"
#include "watertowerclassic/LevelEditorInspectorView.h"
#include "watertowerclassic/LevelEditorView.h"

enum LevelEditorTool {
	LEVEL_EDITOR_TOOL_PENCIL = 100,
	LEVEL_EDITOR_TOOL_RECT,
	LEVEL_EDITOR_TOOL_ERASER,
	LEVEL_EDITOR_TOOL_INSPECT
};

enum LevelEditorObjectType {
	OBJECT_BLOCK_STONE = 1,
	OBJECT_BLOCK_DRY_SOLID,
	OBJECT_BLOCK_WET_SOLID,
	OBJECT_BLOCK_CRUMBLE,
	OBJECT_BLOCK_SWITCHABLE,
	OBJECT_BLOCK_DEATH,
	OBJECT_BLOCK_MOVING,
	OBJECT_BLOCK_FLOATING,
	OBJECT_BLOCK_PHASING,
	OBJECT_BLOCK_LOCK,
	OBJECT_BLOCK_LADDER,
	OBJECT_BLOCK_LEVER,
	OBJECT_BLOCK_PUSHABLE,
	OBJECT_BLOCK_TRAMPOLINE,
	OBJECT_BLOCK_TELEPORT,
	OBJECT_BLOCK_FIRE,
	OBJECT_BLOCK_ICE,
	OBJECT_BLOCK_SAND,
	OBJECT_BLOCK_STICKY,
	OBJECT_BLOCK_FALLING,
	OBJECT_POWERUP_KEY,
	OBJECT_POWERUP_HEART,
	OBJECT_POWERUP_GEM,
	OBJECT_PLAYER_POSITION
};

enum LevelEditorConfirmState {
	CONFIRM_NONE,
	CONFIRM_SAVE,
	CONFIRM_SAVE_BEFORE_QUIT,
	CONFIRM_REVERT,
	CONFIRM_DELETE_LEVEL
};

#define LevelEditorScreen_structContents(self_type) \
	Screen_structContents(self_type) \
	\
	GameSession * gameSession; \
	LevelEditorView * view; \
	LevelEditorInspectorView * inspectorView; \
	LevelSetModel * levelSet; \
	InputController * inputController; \
	GLuint vertexBufferID; \
	GLuint indexBufferID; \
	GLTexture * spriteTexture; \
	GLTextureAtlas * textureAtlas; \
	GLBitmapFont * bitmapFont; \
	unsigned int menuItemIndex; \
	unsigned int levelIndex; \
	unsigned int confirmChoice; \
	enum LevelEditorTool selectedTool; \
	enum LevelEditorObjectType selectedObject; \
	bool reorderingLevel; \
	bool draggingWaterLevel; \
	bool draggingWaterSpeed; \
	bool draggingInspector; \
	Vector2f rawDragOrigin; \
	bool draggingBlocks; \
	struct LevelBlock * blockToPlace; \
	struct LevelBlock blockDefaults[20]; \
	bool erasing; \
	unsigned int dragStartIndex; \
	struct LevelBlock editingBlocks[LEVEL_BLOCK_COUNT_X * LEVEL_BLOCK_COUNT_Y]; \
	unsigned int editingPowerupCount; \
	struct LevelPowerup editingPowerups[LEVEL_POWERUP_COUNT_MAX]; \
	bool showPowerupWarning; \
	enum LevelEditorConfirmState confirmState;

stemobject_struct_definition(LevelEditorScreen)

LevelEditorScreen * LevelEditorScreen_create(GameSession * gameSession);
bool LevelEditorScreen_init(LevelEditorScreen * self, GameSession * gameSession);
void LevelEditorScreen_dispose(LevelEditorScreen * self);
void LevelEditorScreen_activate(LevelEditorScreen * self);
void LevelEditorScreen_deactivate(LevelEditorScreen * self);

#ifdef __cplusplus
}
#endif
#endif
