#ifndef XNA_PLATFORM_DEVICE_DX_HPP
#define XNA_PLATFORM_DEVICE_DX_HPP

#include "../graphics/device.hpp"
#include "../graphics/presentparams.hpp"
#include "dxgi.h"
#include "d3d11.h"

namespace xna {
	class GraphicsDevice : public IGraphicsDevice {
	public:
		GraphicsDevice();
		GraphicsDevice(GraphicsDeviceInformation const& info);

		virtual ~GraphicsDevice() override {
			if (_device) {
				_device->Release();
				_device = nullptr;
			}

			if (_context) {
				_context->Release();
				_context = nullptr;
			}

			if (_factory) {
				_factory->Release();
				_factory = nullptr;
			}
		}

		virtual void Clear() override;
		virtual bool Initialize(GameWindow& gameWindow) override;
		virtual bool Present() override;

		virtual PGraphicsAdapter Adapter() const override {
			return _adapter;
		}

		virtual void Adapter(PGraphicsAdapter const& adapter) override {
			_adapter = adapter;
		}

		virtual constexpr xna::Viewport Viewport() const override {
			return _viewport;
		}

		virtual constexpr void Viewport(xna::Viewport const& viewport) override {
			_viewport = viewport;
		}

		virtual void UseVSync(bool use) override {
			_usevsync = use;
		}

		constexpr void SetCreateFlags(D3D11_CREATE_DEVICE_FLAG flags) {
			_createDeviceFlags |= flags;
		}

		constexpr void ClearCreateFlags() {
			_createDeviceFlags = 0;
		}

		bool GetSwapChainBackBuffer(ID3D11Texture2D*& texture2D);

	public:
		ID3D11Device* _device{ nullptr };
		ID3D11DeviceContext* _context{ nullptr };
		IDXGIFactory1* _factory = nullptr;

	private:
		unsigned int _createDeviceFlags{ 0 };
		D3D_FEATURE_LEVEL _featureLevel{ D3D_FEATURE_LEVEL::D3D_FEATURE_LEVEL_11_0 };
		float _backgroundColor[4] = { 0, 0, 0, 0 };
		xna::PresentationParameters _presentParameters;
		PGraphicsAdapter _adapter{ nullptr };
		PSwapChain _swapChain{ nullptr };
		PRenderTarget2D _renderTarget2D{ nullptr };
		xna::Viewport _viewport{};
		PBlendState _blendState{ nullptr };
		bool _usevsync{ false };

		bool createDevice();
	};	
}

#endif