#pragma once
#include <stdint.h>
#include <string>
#include "mmap.h"

namespace M3D
{

const uint16_t M3DS_VER_MAGIC = 1;
const char M3DS_SIGNATURE[] = "M3DS";
/**
 *@author Denis A. Biryukov <denis.birukov@gmail.com>
 */
#pragma pack(push, 1)
struct M3DS_Header
{
	char signature[ 4 ];
	uint16_t version;
	uint32_t vertex_shader_offset;
	int32_t vertex_shader_size;
	uint32_t fragment_shader_offset;
	int32_t fragment_shader_size;
};
#pragma pack(pop)
struct M3DS_Data
{
	char *vertex_shader;
	char *fragment_shader;
};
class M3DS
{
	public:
		M3DS();
		~M3DS();
		/**
		 * Производит загрузку указанного файла в память.
		 * @param fname имя файла для загрузки.
		 */
		void load ( std::string fname );

		/**
		 * Производит сохранение данных в указанный файл. 
		 * Если такой файл уже существует то он заменяется. 
		 * Все смещения, указанные в заголовке пересчитываются.
		 * @param fname имя файла для сохранения данных
		 */
		void save ( std::string fname );

		/**
		 * Производит установку информации для заголовка файла.
		 * @param value заголовок
		 */
		void set_header ( M3DS_Header* value ) ;
		/**
		 * Получение информации из заголовка файла.
		 * @return константный указатель на заголовок
		 */
		const M3DS_Header* get_header() const { return _header_;};

		/**
		 * Производит установку данных для записи в файл
		 * @param value данные
		 */
		void set_data ( M3DS_Data* value ) ;
		/**
		 * Получение данных ихз файла
		 * @return константный указатель на данные
		 */
		const M3DS_Data* get_data() const { return & _data_;};


	private:
		M3DS_Header *_header_;
		M3DS_Data _data_;
		MMAP _mapped_file_;
};

}


