#pragma once
#include <string>

using namespace std;

class PosMaterial
{
public:
	PosMaterial(void);
	
	/*
	 * Sets the name of this Material (globally unique!)
	 * @param name: the name
	 */
	virtual void setName(string name) = 0;

	/*
	 * Gets the name of this Material
	 * @return the name
	 */
	virtual string getName(void) = 0;

	/*
	 * Sets the Ambient Color
	 * @param ambientColor: float[4]
	 */
	virtual void setAmbientColor(float* ambientColor) = 0;

	/*
	 * Sets the Diffuse Color
	 * @param diffuseColor: float[4]
	 */
	virtual void setDiffuseColor(float* diffuseColor) = 0;

	/*
	 * Informs this Material whether it has a specular Color or not
	 * Expect this to be called before a setSpecularColor() call
	 * @ param hasSpecular:	if true, there'll be a setSpecularColor() call,
	 *						if false, there won't be a setSpecularColor() call
	 */
	virtual void setHasSpecular(bool hasSpecular) = 0;

	/*
	 * Sets the Specular Color
	 * @param specularColor:	float[4]
	 * @param exponent:			the specular exponent
	 */
	virtual void setSpecularColor(float* specularColor, float exponent) = 0;

	/*
	 * Informs this Material whether it has a emissive color or not 
	 * Expect this to be called before a setEmissiveColor() call
	 * @ param hasSpecular:	if true, there'll be a setEmissiveColor() call,
	 *						if false, there won't be a setEmissiveColor() call
	 */
	virtual void setHasEmissive(bool hasEmissive) = 0;

	/*
	 * Sets the Emissive Color
	 * @param emissiveColor: float[4]
	 */
	virtual void setEmissiveColor(float* emissiveColor) = 0;
	
	/*
	 * Sets the number of Textures in this Material
	 * will be called before the first setTextureFilename call
	 * @param numTextures: the number of Textures
	 */
	virtual void setNumTextures(int numTextures) = 0;

	/*
	 * Sets the Texturefilename for a given level
	 * setNumTextures will be called before the first call of this method
	 * @param level: the level of the Texturename to set
	 * @param textureFilename:	the filename for the given level (already includes
	 *							the scene path, so if you passed a relative path from
	 *							your working directory to PosScene::load(), this path
	 *							will be relative as well, if you passed an absolute path,
	 *							this path will be absolute as well.)
	 */
	virtual void setTextureFilename(int level, string textureFilename) = 0;

	virtual ~PosMaterial(void);
};
