#ifndef HALIBUT_ENGINE_INTERFACE_H_INCLUDED
#define HALIBUT_ENGINE_INTERFACE_H_INCLUDED

#include "include/ApplicationInterface.h"

#include "include/TextureManager/SalmonTexture.h"
#include "include/ShaderManager/ShaderManager.h"
#include "include/ScriptManager/ScriptManager.h"
#include "include/GUIManager/GUIManager.h"
#include "include/FrameManager/FrameManager.h"
#include "include/FontManager/FontManager.h"
#include "include/HalibutAnimation/HalibutAnimation.h"
#include "include/SmartValueManager/SmartValueManager.h"



#ifdef TARGET_WIN32
#include "include/SoundManager/SoundManagerWindows.h"
#endif
#ifdef TARGET_ANDROID
#include "include/SoundManager/SoundManagerAndroid.h"
#endif
#ifdef TARGET_IOS
#include "include/SoundManager/SoundManagerIos.h"
#endif

namespace SE
{

//Windows only
struct TMouseState
{
	int X;
	int Y;
	bool LeftButtonPressed;
	bool MiddleButtonPressed;
	bool RightButtonPressed;
};




class THalibutResourceManager
{
public:
	std::string PathToResources;

	TTextureListClass TexList;
	TShaderManager ShaderManager;
    TScriptManager ScriptManager;
    TGUIManager GUIManager;
	TFrameManager FrameManager;
	TFontManager FontManager;
	THalibutAnimationManager HalibutAnimationManager;
	TSmartValueManager SmartValueManager;

	#ifdef TARGET_WIN32
	TSoundManagerWindows SoundManager;
	#endif
	#ifdef TARGET_ANDROID
	TSoundManagerAndroid SoundManager;
	#endif
    #ifdef TARGET_IOS
	TSoundManagerIos SoundManager;
    #endif
};


class TApplicationAncestor : public TApplicationInterface
{
protected:
	
public:

	TApplicationAncestor();

	//If you override them, call ancestor:
	virtual void OuterDraw();
	virtual void OuterUpdate(cardinal dt);


	virtual void OuterOnTapDown(vec2 p);
	virtual void OuterOnTapUp(vec2 p);
	virtual void OuterOnMove(vec2 shift);
	
	virtual void InnerOnTapDown(vec2 p) { }
	
	virtual void InnerOnTapUp(vec2 p) { }
	
	virtual void InnerOnMove(vec2 shift) { }
	
	virtual void OnFling(vec2 v) { } //Android only

	virtual void OnMouseMove(TMouseState& mouseState) { } //Windows only

	virtual void OnMouseWheel(short int delta) { } //Windows only

	virtual void OnKeyPress(cardinal key) { } //Try not to override this. But if you need to override, call ancestor!

};

} //namespace SE

#endif