#pragma once

#include "GameCore.h"
#include "GroundManager.h"
#include "CollisionManager.h"
#include "ScreenManager.h"
#include "TextureManager.h"
#include "DialogueManager.h"
#include "TriggerManager.h"
#include "Character.h"
#include "AStarModified.h"
#include "SoundManager.h"
#include <list>

using namespace std;

//class Character;

typedef list<Character*> CharacterList;
typedef list<Character*>::iterator CharacterListIterator;

class Character;
class CharacterManager
{
public:
	CharacterManager(void);
	~CharacterManager(void);

    // no condition means cant move in the specified direction try another
    enum CAN_MOVE { YES, NO, NO_CONDITIONAL };

	// go through all characters and tell them to tick
	HRESULT tick();
	// return the main character
	Character* getMainCharacter();
	void init( GroundManager* groundManager, TextManager* textManager, CollisionManager* collisionManager, 
               ScreenManager* screenManager, TextureManager* textureManager,  LPDIRECT3DDEVICE9& newDevice,
               DialogueManager* dialogueManager, TriggerManager* newTrigger, SoundManager* newSound);
	void addCharacter( Character* newCharacter );
    // test to see if character can move
    CharacterManager::CAN_MOVE CharacterManager::canMoveCharacter( Character* moveChar, GameCore::DIRECTION aDirection );
    // move character
    void moveCharacter( Character* moveChar, GameCore::DIRECTION aDirection );

	void drawBounds( LPDIRECT3DDEVICE9& device );
	void drawBounds( );
	CharacterList* getCharacters();
	void stopMovingMainChar();

	ScreenManager* getScreenManager();
	AStarModified* getPathAlgorithm();
	CollisionManager* getCollisionManager();

    void removeCharacter( Character* aCharacter );
    void removeCharacter( CharacterListIterator* iter );
	void removeEnemies();
	void removeTownpeople();

	void checkAttack(Character* attacker);
    void addToMainCharacterExperience(int experience);

    void playSound(int whichSound );

private:
	Character* intersectCharacter( Character* aCharacter, RECT* newBounds );
	bool intersectTiles( Character* aCharacter, RECT* newBounds, GameCore::DIRECTION aDirection );

	CharacterList characterList;  //list of all characters excluding main character
	GroundManager* groundManager;
	TextManager* textManager;
	DialogueManager* dialogueManager;
	CollisionManager* collisionManager;
	ScreenManager* screenManager;
	TextureManager* textureManager;
	TriggerManager* triggerManager;
	LPDIRECT3DDEVICE9 device;
    SoundManager* soundManager;

	AStarModified* aStar;

    Character* lastCollider;
};

