#pragma once
#ifndef REAL_BUILD
# include "externals.hh"
#endif


/*= DIALOGS ==================================================================*/

// Base class for a modal dialog that can be pushed to the window's modal
// stack.
class A_ModalDialog
{
    private:
	ebcl::T_Buffer< char > id_;
	bool open_{ false };
	T_Optional< ImVec2 > initialSize_;
	T_StaticArray< ebcl::T_Buffer< char > , 4 > buttons_;

    protected:
	A_ModalDialog( char const* id ) noexcept;
	A_ModalDialog( T_String const& id ) noexcept;

	void setInitialSize( const float width ,
			const float height ) noexcept
		{ initialSize_.setNew( width , height ); }

	// Add a button w/ the specified name, return its identifier
	uint8_t addButton( char const* name ) noexcept;
	uint8_t addButton( T_String const& name ) noexcept;

	// Initialisation, called right before the window is opened.
	// Does nothing by default.
	virtual void initDialog( ) noexcept;

	// Draw the dialog box's contents, returns a mask that determines
	// which buttons should be enabled.
	virtual uint8_t drawDialog( ) noexcept = 0;

	// Button click handler. Returns true if the dialog should be
	// closed.
	virtual bool onButton( uint8_t button ) noexcept = 0;

    public:
	NO_COPY( A_ModalDialog );
	NO_MOVE( A_ModalDialog );
	virtual ~A_ModalDialog( );

	// Draw and handle the dialog box. Returns true if it must be kept,
	// or false if it must be removed from the stack.
	bool draw( ) noexcept;
};
using P_ModalDialog = T_OwnPtr< A_ModalDialog >;

// Simple modal message box with configurable buttons
class T_MessageBox : public A_ModalDialog
{
    public:
	enum E_Button {
		BT_OK ,
		BT_CANCEL ,
		BT_YES ,
		BT_NO ,
	};
	using T_Buttons = T_Flags< E_Button >;

	// Result handler
	using F_Handler = std::function< void( E_Button ) >;

    private:
	ebcl::T_Buffer< char > text_;
	F_Handler handler_;
	uint8_t buttonMask_{ 0 };
	T_StaticArray< E_Button , 4 > buttons_;

	void setButtons( T_Buttons buttons ) noexcept;

    protected:
	uint8_t drawDialog( ) noexcept override;
	bool onButton( uint8_t button ) noexcept override;

    public:
	T_MessageBox( char const* title ,
			char const* text ,
			F_Handler handler = { } ,
			T_Buttons buttons = BT_OK ) noexcept;
	T_MessageBox( T_String const& title ,
			T_String const& text ,
			F_Handler handler = { } ,
			T_Buttons buttons = BT_OK ) noexcept;
};