/**********************************************************************//**
*	\brief Implementace tridy souboru spritu.
*	Trida umoznuje vytvoreni souboru spritu na zaklade dodanych parametru.
*	Druho funkci ne nacteni informaci ze souboru. Na zaklade techto informaci
*	je mozne ze souboru extrahovat jednotlive sninky video sekvence.
*
*
*	\Date 22.12.2008
*	\Author Michal Jirous
*	\File spritefile.h
***************************************************************************/


#ifndef __SPRITEFILE_H__
#define __SPRITEFILE_H__


#include <list>
#include <string>

const std::string FILE_IDENTIFIER = "PHSPR1";


/** @brief Struktura parametru spritu. */
struct Parameter
{
	std::string name;		/*!< @brief Nazev parametru. */
	std::string value;		/*!< @brief Hodnota parametru. */
};

/** @brief Struktura souboru spritu. */
struct SingleFile
{
	std::string filename;	/*!< @brief Jmeno souboru. */
	std::size_t offset;		/*!< @brief Offset k datum v souboru (pouziva se pri extrahovani dat ze souboru spritu). */
	std::size_t size;		/*!< @brief Velikost souboru. */
};

/** @brief Hlavni operacni trida, kde se provadi ukladani a nacitani spritu.*/
class SpriteFile
{
	void writeString( std::string str, std::ofstream &fout );
	std::string readString( std::ifstream &fin );
	size_t getFileSize( const char *filename );

public:
    std::string skipDirectories( std::string filename );    /*!< @brief Odstrani z cesty k souboru adresare a ponecha pouze nazev souboru. */

	std::list<Parameter> m_Parameters;			/*!< @brief Seznam parametru spritu. */
	std::list<SingleFile> m_Files;				/*!< @brief Seznam jednotlivych sminku spritu. */

	SpriteFile();           /*!< @brief Konstruktor inicializuje data. */

	bool loadSprite( std::string filename, std::string directory = "" );	/*!< @brief Nacte informace ze soubnoru spritu. */
	bool saveSprite( std::string filename, std::string directory = "" );	/*!< @brief Vytvori soubor spritu na zaklade informaci v databazi. */

	void clearDatabase();						/*!< @brief Vymaze vsechny informace o spritu. */

	void addParameter( std::string name, std::string value );	/*!< @brief Vlozi novy parameter do databaze, pokud uz takovy parameter v databazi je, tak se prepise hodnota. */
	void addFile( std::string name, size_t offset = 0, size_t size = 0 );			/*!< @brief Vlozi do seznamu souboru novy soubor pouze pokud tam neni. */
};




#endif

