#ifndef TEXTBOX_H
#define TEXTBOX_H

#include "util.h"
#include "text.h"
#include "button.h"

namespace vb01{
	class Node;
	class Quad;
}

namespace vb01Gui{
	class Slider;

	class Textbox{
		public: 
			Textbox(vb01::Vector3, vb01::Vector2, std::string, std::wstring = L"");
			~Textbox();
			void update();
			void enable();
			void disable();
			void type(vb01::u32, bool = false);
			void moveCursor(bool, float);
			void deleteCharacter();
			void setEntry(std::wstring);
			void remove();
			inline void setSlider(Slider *s){this->slider = s;}
			inline bool isEnabled(){return enabled;}
			inline std::wstring getText(){return text->getText();}
			inline void setDeleteCharacters(bool del){this->deleteCharacters = del;}
			inline bool isDeleteCharacters(){return deleteCharacters;}
		private:
			class TextboxButton : public Button{
				public:
					TextboxButton(Textbox*, vb01::Vector3, vb01::Vector2, std::string);
					void onClick();
				private:
					Textbox *textbox;
			};
			inline bool canChangeCursor(){return vb01::getTime() - lastBlinkTime > 250;}
			inline bool canDeleteChar(){return vb01::getTime() - lastDeleteTime > 50;}

			float cursorZCoord;
			const int cursorWidth = 5;
			vb01::Vector3 pos;
			vb01::Vector2 size;
			std::wstring entry = L"";
			std::string fontPath = "";
			bool enabled = false, canShowCursor = false, capitalLeters = false, deleteCharacters = false;
			vb01::s64 lastBlinkTime = 0, lastDeleteTime = 0, cursorPosOffset = 0;
			vb01::Quad *cursorRect;
			vb01::Text *text;
			vb01::Node *guiNode, *textNode, *cursorNode;
			TextboxButton *textboxButton;
			Slider *slider = nullptr;
		public:
			inline TextboxButton* getTextboxButton(){return textboxButton;}
	};
}

#endif
