#pragma once
#include <memory>

#ifdef BKSCRDLL_EXPORTS
#define BKSCRDLL_API __declspec(dllexport)
#else
#define BKSCRDLL_API __declspec(dllimport)
#endif

#ifdef __cplusplus
#define BKEXTERN_C     extern "C"
#else
#define BKEXTERN_C
#endif // __cplusplus

// структура, в которой собраны все индивидуальные параметры текстуры экрана
struct BKScreen_t
{
	std::unique_ptr<uint32_t[]> pTexture;    // указатель на выделенную память текстуры.
	uint32_t    nTextureSize{ 0 };      // размер текстуры в байтах
	uint32_t    nPitch{ 0 };
	int         nWidth{ 0 };            // реальная ширина текстуры в пикселах
	int         nHeight{ 0 };           // реальная ширина текстуры в пикселах
	RECT        rcFSDim{ RECT() };      // текущее разрешение экрана
	RECT        rcFSViewPort{ RECT() }; // размер viewporta в полноэкранном режиме
	// left, top - координаты экрана, right, bottom - размеры, а не координаты!!!

	void deleteTexture() noexcept
	{
		pTexture.reset();
	}

	bool createTexture(int w, int h)
	{
		nWidth = w;
		nHeight = h;
		const int nBitSize = w * h;
		nTextureSize = nBitSize * sizeof(uint32_t);
		nPitch = w * sizeof(uint32_t);
		pTexture = std::make_unique<uint32_t[]>(nBitSize);
		return (pTexture != nullptr);
	}
};

BKEXTERN_C class BKSCRDLL_API CBKScreen_Shared
{
	protected:
		HWND                m_hwndScreen{ nullptr };    // хэндл окна оконного режима
		CWnd               *m_pwndMain{ nullptr };      // указатель на главное окно
		CWnd               *m_pwndParent{ nullptr };    // указатель на родительское окно (View)
		CWnd               *m_pwndScreen{ nullptr };    // указатель на окно оконного режима
		bool                m_bFullScreen{ false };     // флаг работы в полноэкранном режиме
		BKScreen_t         *m_pScreen{ nullptr };

		WINDOWPLACEMENT     m_windowedPlacement{};
		WINDOWPLACEMENT     m_mainPlacement{};

	public:
		virtual HRESULT     BKSS_ScreenView_Init(BKScreen_t *pScPar, CWnd *pwndScr)
		{
			// заполняем хэндлы и указатели на окна
			m_pwndScreen    = pwndScr;
			m_pwndParent    = m_pwndScreen->GetParent();
			m_pwndMain      = m_pwndParent->GetParentOwner();
			m_hwndScreen    = m_pwndScreen->GetSafeHwnd();
			m_pScreen       = pScPar;
			return S_OK;
		}

		virtual HRESULT     BKSS_ScreenView_ReInit(BKScreen_t *pScPar)
		{
			m_pScreen = pScPar;
			return S_OK;
		}

		virtual void        BKSS_ScreenView_Done() {}
		virtual void        BKSS_DrawScreen() {}
		virtual void        BKSS_RestoreFullScreen() {}
		virtual bool        BKSS_SetFullScreenMode()
		{
			return false;
		}
		virtual bool        BKSS_SetWindowMode()
		{
			return false;
		}
		virtual CWnd       *BKSS_GetBackgroundWindow()
		{
			return nullptr;
		}

		virtual void        BKSS_SetSmoothing(bool bSmoothing) {}
		virtual void        BKSS_SetColorMode() {}
		virtual void        BKSS_OnEraseBackground() {}
		virtual void        BKSS_OnSize(int cx, int cy) {}

		CBKScreen_Shared()
			: m_windowedPlacement{}
			, m_mainPlacement{}
		{}
		virtual ~CBKScreen_Shared()
		    = default;

		virtual bool BKSS_GetReverseFlag()
		{
			return false;
		}

		virtual bool BKSS_IsFullScreenMode()
		{
			return m_bFullScreen;
		}
};

using BKSCREENHANDLE = CBKScreen_Shared *;

