#ifndef IRR_C_MESH_TEXTURE_LOADER_H_INCLUDED
#define IRR_C_MESH_TEXTURE_LOADER_H_INCLUDED

#include "IMeshTextureLoader.h"

namespace irr
{
namespace io
{
	class IFileSystem;
} // end namespace io
namespace video
{
	class IVideoDriver;
}

namespace scene
{

class CMeshTextureLoader : public IMeshTextureLoader
{
public:
	CMeshTextureLoader(irr::io::IFileSystem* fs, irr::video::IVideoDriver* driver);

	//! Set a custom texture path.
    /**	This is the first path the texture-loader should search.  */
	virtual void setTexturePath(const irr::io::path& path)  _IRR_OVERRIDE_;

	//! Get the current custom texture path.
	virtual const irr::io::path& getTexturePath() const  _IRR_OVERRIDE_;

	//! Get the texture by searching for it in all paths that makes sense for the given textureName.
	/** Usually you do not have to use this method, it is used internally by IMeshLoader's.
	\param textureName Texturename as used in the mesh-format
	\return Pointer to the texture. Returns 0 if loading failed.*/
	virtual irr::video::ITexture* getTexture(const irr::io::path& textureName)  _IRR_OVERRIDE_;

	//! Meshloaders will search paths relative to the meshFile.
	/** Usually you do not have to use this method, it is used internally by IMeshLoader's.
		Any values you set here will likely be overwritten internally. */
	virtual void setMeshFile(const irr::io::IReadFile* meshFile) _IRR_OVERRIDE_;

	//! Meshloaders will try to look relative to the path of the materialFile
	/** Usually you do not have to use this method, it is used internally by IMeshLoader's.
	Any values you set here will likely be overwritten internally.	*/
	virtual void setMaterialFile(const irr::io::IReadFile* materialFile) _IRR_OVERRIDE_;

protected:
	// make certain path's have a certain internal format
	void preparePath(irr::io::path& directory)
	{
		if (!directory.empty())
		{
			if (directory == _IRR_TEXT("."))
				directory = _IRR_TEXT("");

			directory.replace(_IRR_TEXT('\\'),_IRR_TEXT('/'));
			if (directory.lastChar() != _IRR_TEXT('/'))
				directory.append(_IRR_TEXT('/'));
		}
	}

	// Save the texturename when it's a an existing file
	bool checkTextureName( const irr::io::path& filename);

private:
	irr::io::IFileSystem * FileSystem;
	irr::video::IVideoDriver* VideoDriver;
	irr::io::path TexturePath;
	const irr::io::IReadFile* MeshFile;
	irr::io::path MeshPath;
	const irr::io::IReadFile* MaterialFile;
	irr::io::path MaterialPath;
	irr::io::path TextureName;
};

} // end namespace scene
} // end namespace irr

#endif