// AppMain.h: interface for the CAppMain class.
//
//////////////////////////////////////////////////////////////////////

/** \file AppMain.h
	\brief Rozhraní pro třídu CAppMain
*/

#if !defined(_APPMAIN_)
#define _APPMAIN_


#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include <string>
#include "tinyxml.h"
#include "Camera.h"
#include "FilterManager.h"
#include "PatternManager.h"

#define TEST

/** Třída zapouzdřující funkce pro práci s programem.
	Umožnuje snadné navázání na třídy grafického rozhraní.
*/
class CAppMain
{
private:
	string m_projName;	///< Název projektu pro uložení
	string m_savePath;	///< Cesta k projektu
	string m_fileType;	///< Typ obrazových souborů (*.jpg, *.tif, atd.)
	CCamera m_camera;	///< Objekt snímacího zařízení
	CPatternManager m_patternManager;	///< Správce testovacího vzoru
	CFilterManager m_filterManager;		///< Správce filtrů
public:
	CAppMain(void);		///< Konstruktor
	~CAppMain(void);	///< Destruktor

	CPrimitiveBase* CAppMain::CreateLayer(CPrimitiveBase* pPB=NULL);


	/***************** Metody rozhranni kamery *****************/
	void SetCamera(int width, int height, int distanceO);	///< Inicializuje objekt kamery
	void SetCamera(CCamera const & cam) {m_camera = cam;m_patternManager.SetCamera(cam); }

	/***************** Metody rozhranni predloh *****************/
	
	/** Vytvoří vrstvu typu \b kruh se zadanýmy parametry a zařadí na konec seznamu vytvořených
	*/
	CPrimitiveBase* CreateLayer(const char* title, int distance, CStructures::fPoint center, int radius, CStructures::ARGBPixel Object, CStructures::ARGBPixel Env);
	
	/** Vytvoří vrstvu typu \b úsečka se zadanýmy parametry a zařadí na konec seznamu vytvořených
	*/
	CPrimitiveBase* CreateLayer(const char* title, int distance, CStructures::iPoint begin, CStructures::iPoint end, int thick, CStructures::ARGBPixel Object, CStructures::ARGBPixel Env);
	
	/** Zařadí vytvořenou vrstvu do seznamu pro předlohu na daný index
		@param[in] pLayer - ukazatel na vytvořenou vrstvu
		@param[in] index - pozice na kterou se vrstva zařadí
	*/
	//MRXXXvoid RegisterLayer(CPrimitiveBase* pLayer, int index);

	/** Zařadí vytvořenou vrstvu z pozice v seznamu vševch vrstev na pozici v seznamu vrstev pro předlohu
		@param[in] posFrom - pozice v seznamu všech vytvořených vrstev
		@param[in] posTo - pozice v seznamu na kterou se zařadí vrstva
	*/
	
	void RegisterLayer(int posFrom, int posTo);
/*//MRXXX 
	void RegisterLayer();	///< Zařadí do předlohy všechny vrstvy
	void RemoveRegistredLayer(int index);	///< Odstraní vrstvu ze seznamu předlohy na dané pozici 
	void RemoveRegistredLayer();			///< Odstraní všechny vrstvy ze seznamu předlohy
	void RotateLayer(double angleX, double angleY, double angleZ, int layerPos); ///< Rotace vrstvy okolo os x,y,z - tady nemá  co dělat (pokud to není nastavení)
	void TranslateLayer(int dx, int dy, int layerPos);	///< Posun vrstvy v rovině - tady nemá  co dělat (pokud to není nastavení)
	void LayerXRepetition(int period, int cycles, int layerPos);	///< Perioda a počet opakování vrstvy v předloze- tady nemá  co dělat (pokud to není nastavení)
	void LayerYRepetition(int period, int cycles, int layerPos);	///< Perioda a počet opakovaní vrstvy v předloze- tady nemá  co dělat (pokud to není nastavení)
	int LayerPreview(int width, int height, bool useFile, const char* fileName = "");	///< Náhled předlohy
	void MoveUpLayer(int index);	///< Posun vrstvy v pořadí vpřed
	void MoveDownLayer(int index);	///< Posun vrstvy v pořadí vzad
	*/
	/***************** Metody rozhranni filtru *****************/
	/** Vytvořífiltr typu se zadanýmy parametry a zařadí na konec seznamu vytvořených.
		@param type - ID filtru. 0=kamera, 1=soudkovitost, 2=vinětace
		@param title - jméno souboru při uložení
		@param bSave - zda se uloží výsledek
		@param bDisplay - zda se výsledek zobrazí
	*/
	CFilterBase* CreateFilter(int type, const char* title, double param, bool bSave, bool bDisplay);
	
	/** Zařadí vytvořený filtr z pozice v seznamu všech filtrů na pozici v seznamu filtrů pro výpočet
		@param[in] posFrom - pozice v seznamu všech vytvořených filtrů
		@param[in] posTo - pozice v seznamu na kterou se zařadí filtr
	*/
	 
	void RegisterFilter(int posFrom, int posTo);
/*//MRXXX
	void RegisterFilter();					///< Zařadí do výpočtuy všechny filtry
	void RemoveRegistredFilter(int index);	///< Odstraní filtr ze seznamu pro výpočet na dané pozici
	void RemoveRegistredFilter();			///< Odstraní všechny filtry v seznamu pro výpočet	
	void MoveUpFilter(int index);			///< Posun filtru v pořadí vpřed
	void MoveDownFilter(int index);			///< Posun filtru v pořadí vzad

	/***************** Metoda pro spusteni simulace *****************/
	/** Spustí výpočet
		@param[in] useFile \c true = předloha je ze souboru, \c false = tvoří se vlastní předloha
		@param[in] fileName - název pro uložení předlohy
		@return 0 - výpočet proběhl v pořádku
		@return 1,2, atd. Při výpočtu došlo k chybě
	*/
	int RunSimulation(bool useFile, const char* fileName = "");
	int RunSimulationNew(bool useFile, const char* fileName = "kamera.bmp"); //MR nové algoritmy 

	/***************** Metody pro ukladani a nahravani projektu *****************/
	/*//MRXXX 
	void SetPath(const char* pPath){m_savePath = pPath;}		///< Nastaví cestu projektu
	const char* GetPath(){return m_savePath.c_str();}			///< Vrátí cetu projektu
	void SetProjName(const char* pName){m_projName = pName;}	///< Nastaví jméno projektu
	const char* GetProjName(){return m_projName.c_str();}		///< Vrátí jméno projektu
	void Save(const char* pFileName);							///< Uloží projekt v XML formátu
	void Save();
	int Load(const char* pFileName);							///< Načte projekt z XML souboru
	*/
};
#endif //_APPMAIN_