#pragma once

#include "Logger.h"
#include <d3d11.h>
#include <d3dcompiler.h>
#include <directxmath.h>
#include <fstream>
using namespace DirectX;
using namespace std;

class sunlight_shader_class
{

private :
	struct matrix_buffer_type
	{
		XMMATRIX world;
		XMMATRIX view;
		XMMATRIX projection;
	};

	struct camera_buffer_type
	{
		XMFLOAT3 camera_position;
		float padding;
	};

	struct sun_light_buffer_type
	{
		XMFLOAT4 diffuse_color;
		XMFLOAT4 ambient_color;
		XMFLOAT3 sun_direction;
		float intensity;
	};

	struct sun_light_color_buffer_type
	{
		XMFLOAT4 sun_color;
	};

public :
	sunlight_shader_class();
	sunlight_shader_class(const sunlight_shader_class&);
	~sunlight_shader_class();

	bool initialize(ID3D11Device*, HWND);
	void shutdown();
	bool render(ID3D11DeviceContext*, int, XMMATRIX, XMMATRIX, XMMATRIX, ID3D11ShaderResourceView*, XMFLOAT4, XMFLOAT4, XMFLOAT3,float);

private:
	bool initialize_shader(ID3D11Device*, HWND, WCHAR*, WCHAR*);
	void shutdown_shader();
	void output_shader_error_message(ID3D10Blob*, HWND, WCHAR*);

	bool set_shader_parameters(ID3D11DeviceContext*, XMMATRIX, XMMATRIX, XMMATRIX, ID3D11ShaderResourceView*, XMFLOAT4, XMFLOAT4, XMFLOAT3, float);
	void render_shader(ID3D11DeviceContext*, int);

private:
	ID3D11VertexShader* vertex_shader_;
	ID3D11PixelShader* pixel_shader_;
	ID3D11InputLayout* layout_;
	ID3D11SamplerState* sample_state_;
	ID3D11Buffer* matrix_buffer_;
	ID3D11Buffer* camera_buffer_;
	ID3D11Buffer* sunlight_buffer_;
	ID3D11Buffer* sunlight_color_buffer_;
	ID3D11Buffer* sunlight_position_buffer_;
};