#ifndef XNA_PLATFORM_RASTERIZERSTATE_DX_HPP
#define XNA_PLATFORM_RASTERIZERSTATE_DX_HPP

#include "../graphics/rasterizerstate.hpp"
#include "../graphics/gresource.hpp"
#include "dxheaders.hpp"

namespace xna {
	class RasterizerState : public IRasterizerState, public GraphicsResource {
	public:
		RasterizerState(sptr<GraphicsDevice> const& device) : GraphicsResource(device){}

		virtual ~RasterizerState() override {
			if (dxRasterizerState) {
				dxRasterizerState->Release();
				dxRasterizerState = nullptr;
			}
		}

		virtual bool Initialize(xna_error_nullarg) override;
		virtual bool Apply(xna_error_nullarg) override;

		virtual constexpr xna::CullMode CullMode() const override {
			return static_cast<xna::CullMode>(static_cast<int>(dxDescription.CullMode) - 1);			
		}

		virtual constexpr void CullMode(xna::CullMode value) override {
			dxDescription.CullMode = static_cast<D3D11_CULL_MODE>(static_cast<int>(value) + 1);
		}

		virtual constexpr xna::FillMode FillMode() const override {
			return static_cast<xna::FillMode>(static_cast<int>(dxDescription.FillMode) - 2);			
		}

		virtual constexpr void FillMode(xna::FillMode value) override {
			dxDescription.FillMode = static_cast<D3D11_FILL_MODE>(static_cast<int>(value) + 2);			
		}

		static uptr<RasterizerState> CullNone();
		static uptr<RasterizerState> CullClockwise();
		static uptr<RasterizerState> CullCounterClockwise();

	public:
		ID3D11RasterizerState* dxRasterizerState = nullptr;
		D3D11_RASTERIZER_DESC dxDescription{};

	private:
		RasterizerState() : GraphicsResource(nullptr){}
	};
}

#endif