
#ifndef SPECTRE_PLATFORM_DISPLAY_H
#define SPECTRE_PLATFORM_DISPLAY_H

#include <Spectre/Math/Vector2.h>
#include <Spectre/Display/DisplayDescription.h>
#include <Spectre/Display/DisplayMode.h>
#include <string>
#include <cstdint>

// Low-level platform dependant API.

namespace sp {

class Display;

class PlatformDisplay
{
public :
	// Factory method.
	static PlatformDisplay* make(Display* parent);

	virtual ~PlatformDisplay();

	virtual bool create(DisplayDescription description) = 0;

	virtual void destroy() = 0;

	virtual void* getHandle() const = 0;

	virtual bool isValid() = 0;

	virtual void setSize(unsigned int width, unsigned int height) = 0;

	virtual Vector2u getSize() const = 0;

	virtual void setPosition(unsigned int x, unsigned int y) = 0;

	virtual Vector2u getPosition() const = 0;

	virtual void setVisible(bool visible) = 0;

	virtual void setDecoration(unsigned decoration) = 0;

	virtual void minimize() = 0;

	virtual void maximize() = 0;

	virtual void enterFullscreen(DisplayMode mode) = 0;

	virtual void exitFullscreen() = 0;

	virtual void setCaption(const std::string& caption) = 0;

	virtual void setIcon(unsigned int width, unsigned int height, const uint8_t *pixels) = 0;

	virtual void showCursor(bool value) = 0;

	virtual void grabCursor(bool value) = 0;

protected :

	PlatformDisplay();

	void onReshape(int width, int height);

private :

	Display * m_parent;
};

} // namespace sp

#endif /* SPECTRE_PLATFORM_DISPLAY_H  */
