#ifndef _WResourceManager_H_
#define _WResourceManager_H_

#include "WResource_Fwd.h"
#include <JResourceManager.h>
#include <JSoundSystem.h>

const std::string kGenericCardID = "back";
const std::string kGenericCardThumbnailID = "back_thumb";

const std::string kGenericCard("back.jpg");
const std::string kGenericThumbCard("back_thumb.jpg");

enum ENUM_WRES_INFO
{
    WRES_UNLOCKED = 0,      //Resource is unlocked.
    WRES_MAX_LOCK = 250,    //Maximum number of locks for a resource.
    WRES_PERMANENT = 251,   //Resource is permanent (ie, managed)  
    WRES_UNDERLOCKED = 252, //Resource was released too many times.
};

enum ENUM_RETRIEVE_STYLE
{
	RETRIEVE_EXISTING, 	//Only returns a resource if it already exists. Does not lock or unlock.
    RETRIEVE_NORMAL,    //Returns or creates a resource. Does not change lock status.
    RETRIEVE_LOCK,      //As above, locks cached resource. Not for quads.
    RETRIEVE_UNLOCK,    //As above, unlocks cached resource. Not for quads.
    RETRIEVE_RESOURCE,  //Only retrieves a managed resource. Does not make a new one.
    RETRIEVE_MANAGE,    //Makes resource permanent.
    RETRIEVE_THUMB,     //Retrieve it as a thumbnail.
    CACHE_THUMB = RETRIEVE_THUMB, //Backwards compatibility. 
};

enum ENUM_CACHE_SUBTYPE
{
    CACHE_NORMAL =  (1<<0),    //Use default values. Not really a flag.
    //CACHE_EXISTING = (1<<1),   //Retrieve it only if it already exists

    //Because these bits only modify how a cached resource's Attempt() is called,
    //We can use them over and over for each resource type.
    TEXTURE_SUB_EXACT = (1<<2),   //Don't do any fiddling with the filename.
    TEXTURE_SUB_CARD = (1<<3),    //Retrieve using cardFile, not graphicsFile.
    TEXTURE_SUB_AVATAR = (1<<4),  //Retrieve using avatarFile, not graphicsFile.
    TEXTURE_SUB_THUMB = (1<<5),   //Retrieve prepending "thumbnails\" to the filename.
    TEXTURE_SUB_5551 = (1<<6),    //For textures. If we have to allocate, use RGBA5551.

};

enum ENUM_CACHE_ERROR
{
    CACHE_ERROR_NONE = 0,
    CACHE_ERROR_NOT_CACHED = CACHE_ERROR_NONE,
    CACHE_ERROR_404,
    CACHE_ERROR_BAD, 		//Something went wrong with item->attempt()
    CACHE_ERROR_BAD_ALLOC, 	//Couldn't allocate item
    CACHE_ERROR_LOST,
    CACHE_ERROR_NOT_MANAGED,
};

struct WManagedQuad; 
class WFont;
class MTGCard;
struct hgeParticleSystemInfo;

class WResourceManager
{
public:
    static WResourceManager* Instance();
    static void Terminate();

    virtual ~WResourceManager()
	{
	}

    virtual bool IsThreaded() = 0;
	void PlaySample(const string& fileName) {
		JSample*sample = RetrieveSample(fileName);
		if(sample) {
            JSoundSystem::GetInstance()->PlaySample(sample);			
		}
	};
    virtual JQuadPtr RetrieveCard(MTGCard * card, int style = RETRIEVE_NORMAL,int submode = CACHE_NORMAL) = 0;
    virtual JSample * RetrieveSample(const string& filename, int style = RETRIEVE_NORMAL, int submode = CACHE_NORMAL) = 0;
    virtual JTexture * RetrieveTexture(const string& filename, int style = RETRIEVE_NORMAL, int submode = CACHE_NORMAL) = 0;
    virtual JQuadPtr RetrieveQuad(const string& filename, float offX=0.0f, float offY=0.0f, float width=0.0f, float height=0.0f,  string resname="",  int style = RETRIEVE_NORMAL, int submode = CACHE_NORMAL, int id = 0) = 0;
    virtual JQuadPtr RetrieveTempQuad(const string& filename, int submode = CACHE_NORMAL) = 0;
    virtual hgeParticleSystemInfo * RetrievePSI(const string& filename, JQuad * texture, int style = RETRIEVE_NORMAL, int submode = CACHE_NORMAL) = 0;
    virtual int RetrieveError() = 0;

    virtual void Release(JTexture * tex) = 0;
    virtual void Release(JSample * sample) = 0;

	//Refreshes all files in cache, for when mode/profile changes.
    virtual void Refresh() = 0;

    //Manual clear of the cache
    virtual void ClearUnlocked() = 0;

    virtual unsigned int nowTime() = 0;

    virtual JQuadPtr GetQuad(const string &quadName) = 0;

    //Our file redirect system.
    virtual string graphicsFile(const string& filename) = 0;
    virtual string avatarFile(const string& filename) = 0;
    virtual string cardFile(const string& filename) = 0;
    virtual string musicFile(const string& filename) = 0;
    virtual string sfxFile(const string& filename) = 0;
    virtual bool fileOK(const string&) = 0;
    virtual bool dirOK(const string& dirname) = 0;

    //For backwards compatibility with JWResourceManager. Avoid using these, they're not optimal.
    virtual int CreateTexture(const string &textureName) = 0;
    virtual JTexture* GetTexture(const string &textureName) = 0;

    // Font management functions
    virtual void InitFonts(const std::string& inLang) = 0;
    virtual int ReloadWFonts() = 0;
    virtual WFont* LoadWFont(const string& inFontname, int inFontHeight, int inFontID) = 0;
    virtual WFont* GetWFont(int id) = 0;

    //Wrapped from JSoundSystem. TODO: Privatize.
    virtual JMusic * ssLoadMusic(const char *fileName) = 0;

    //Resets the cache limits on when it starts to purge data.
    virtual void ResetCacheLimits() = 0;

    virtual void DebugRender() = 0;

protected:
    /*
    ** Singleton object only accessibly via Instance(), constructor is private
    */
    WResourceManager()
	{
	}

    static WResourceManager* sInstance;
};

#endif
