#ifndef _CXMLOADER_HPP_
#define _CXMLOADER_HPP_

/*** TinyXML Header File ***/
#include "tinyxml2.h"

/*** DLL Header File ***/
#include "dllExport.h"

/*** Custom Header Files ***/
#include "GUIUtility.hpp"

#include "../cWindow.hpp"
#include "../cPanel.hpp"
#include "../cLayout.hpp"
#include "../cLabel.hpp"
#include "../cBoxSizer.hpp"

#include "../../UtilityEngine/cString.hpp"

using UtilityEngine::cString;

namespace GUIHelpers {
	class EXPORT_FROM_MYDLL cXMLoader
	{
	public:
		cXMLoader();
		~cXMLoader();

		void Load( const cString& filename, const cString& dir = "", GUIEngine::cWindow* parent = nullptr );

	private:
		void GetElement( tinyxml2::XMLElement& element, GUIEngine::cWindow* parent = nullptr ) const;
		const cString GetAttribute( const tinyxml2::XMLElement& element, const cString& attribute ) const;

		void Include( const tinyxml2::XMLElement& element, GUIEngine::cWindow* parent ) const;
		void GUISetup( const tinyxml2::XMLElement& element ) const;
		void Default( const tinyxml2::XMLElement& element );
		void Debug( const tinyxml2::XMLElement& element );

		GUIEngine::cPanel* PanelBuild( const tinyxml2::XMLElement& element, GUIEngine::cWindow* parent ) const;
		GUIEngine::cLayout* LayoutBuild( const tinyxml2::XMLElement& element, GUIEngine::cWindow* parent ) const;
		GUIEngine::cLabel* LabelBuild( const tinyxml2::XMLElement& element, GUIEngine::cWindow* parent ) const;
		GUIEngine::cBoxSizer* BoxSizerBuild( const tinyxml2::XMLElement& element, GUIEngine::cWindow* parent ) const;

		const cString getDir( const tinyxml2::XMLElement& element ) const;
		const cString getFileName( const tinyxml2::XMLElement& element ) const;
		const unsigned long int getDebug( const tinyxml2::XMLElement& element ) const;
		const bool cXMLoader::getDebugXML(const tinyxml2::XMLElement& element) const;
		const signed long int getID( const tinyxml2::XMLElement& element ) const;
		const GUIHelpers::eOrientation getOrientation( const tinyxml2::XMLElement& element ) const;
		const GUIHelpers::eAlign getAlign( const tinyxml2::XMLElement& element ) const;
		const GUIHelpers::eLayout getLayout( const tinyxml2::XMLElement& element ) const;
		const GUIHelpers::Position getPosition( const tinyxml2::XMLElement& element ) const;
		const GUIHelpers::Size getSize( const tinyxml2::XMLElement& element ) const;
		const GUIHelpers::Padding getPadding( const tinyxml2::XMLElement& element ) const;
		const cString getText( const tinyxml2::XMLElement& element ) const;

		const GUIHelpers::RGBA getColour( const tinyxml2::XMLElement& element ) const;
		const signed long int getFontSize( const tinyxml2::XMLElement& element ) const;

		void LoadDefault() const;
		
	private:
		bool m_loadDef;// = false;
		bool m_debugXML;

		GUIHelpers::eOrientation m_orientation;// = GUIHelpers::eOrientation::DEFAULT_ORIENTATION;
		GUIHelpers::eAlign m_align;// = GUIHelpers::eAlign::DEFAULT_ALIGN;
		GUIHelpers::eLayout m_layout;// = GUIHelpers::eLayout::DEFAULT_LAYOUT;
		GUIHelpers::Position m_pos;// = { -1, -1 };
		GUIHelpers::Size m_size;// = { -1, -1 };
		GUIHelpers::Padding m_pad;// = { -1, -1, -1, -1 };
	};/// END CLASS DEFINITION cXMLoader
}/// END NAMESPACE DEFINITION GUIHelpers
#endif/// END IFNDEF _CXMLOADER_HPP_
