#if GE_GRAPHICS_DX11

using DirectX.D3D11;
using GlitchyEngine.Platform.DX11;

using internal GlitchyEngine.Renderer;
using internal GlitchyEngine.Platform.DX11;

namespace GlitchyEngine.Renderer
{
	extension FillMode
	{
		public static explicit operator DirectX.D3D11.FillMode(Self fm) => fm == .Solid ? .Solid : .Wireframe;
	}
	
	extension CullMode
	{
		public static explicit operator DirectX.D3D11.CullMode(Self cm)
		{
			if(cm == .None)
				return .None;
			
			if(cm == .Front)
				return .Front;
			
			return .Back;
		}
	}

	extension RasterizerStateDescription
	{
		public static explicit operator DirectX.D3D11.RasterizerStateDescription(Self description)
		{
			DirectX.D3D11.RasterizerStateDescription result = .();
			result.FillMode = (.)description.FillMode;
			result.CullMode = (.)description.CullMode;
			result.FrontCounterClockwise = description.FrontCounterClockwise;
			result.DepthBias = description.DepthBias;
			result.DepthBiasClamp = description.DepthBiasClamp;
			result.SlopeScaledDepthBias = description.SlopeScaledDepthBias;
			result.DepthClipEnable = description.DepthClipEnabled;
			result.ScissorEnable = description.ScissorEnabled;
			result.MultisampleEnable = description.MultisampleEnabled;
			result.AntialiasedLineEnable = description.AntialiasedLineEnabled;

			return result;
		}
	}

	extension RasterizerState
	{
		internal DirectX.D3D11.RasterizerStateDescription nativeDescription;
		internal ID3D11RasterizerState* nativeRasterizerState ~ _?.Release();

		public override this(GlitchyEngine.Renderer.RasterizerStateDescription description)
		{
			Debug.Profiler.ProfileRendererFunction!();

			_description = description;
			nativeDescription = (.)_description;

			var result = NativeDevice.CreateRasterizerState(ref nativeDescription, &nativeRasterizerState);
			if(result.Failed)
			{
				Log.EngineLogger.Error($"Failed to create rasterizer state. Message({(int)result}): {result}");
			}
		}
	}
}

#endif
