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

namespace M3D
{

const uint16_t M3DM_VER_MAGIC = 3;
const char M3DM_SIGNATURE[] = "M3DM";
/**
 *@author Denis A. Biryukov <denis.birukov@gmail.com>
 */
#pragma pack(push, 1)
struct M3DM_Header
{
char signature[4];
uint16_t version;
uint8_t model_name_length;
uint32_t model_name_offset;
uint16_t base_path_length;
uint32_t base_path_offset;
uint16_t material_name_length;
uint32_t material_name_offset;
uint16_t mesh_name_length;
uint32_t mesh_name_offset;
};
#pragma pack(pop)
struct M3DM_Data
{
	char *model_name;
	char *base_path;
	char *material_name;
	char *mesh_name;
};
class M3DM
{
	public:
		M3DM();
		~M3DM();
		/**
		 * Производит загрузку указанного файла в память.
		 * @param fname имя файла для загрузки.
		 */
		void load ( std::string fname );

		/**
		 * Производит сохранение данных в указанный файл. 
		 * Если такой файл уже существует то он заменяется. 
		 * Все смещения, указанные в заголовке пересчитываются.
		 * @param fname имя файла для сохранения данных
		 */
		void save ( std::string fname );
		
		/**
		 * Производит установку информации для заголовка файла.
		 * @param value заголовок
		 */
		void set_header ( M3DM_Header* value ) ;
                /**
		 * Получение информации из заголовка файла.
		 * @return константный указатель на заголовок
		 */
		const M3DM_Header* get_header() const {return _header_;};
		
		/**
		 * Производит установку данных для записи в файл
		 * @param value данные
		 */
		void set_data ( M3DM_Data* value ) ;
                /**
		 * Получение данных ихз файла
		 * @return константный указатель на данные
		 */
		const M3DM_Data* get_data() const {return &_data_;};
		
	private:
		MMAP _mapped_file_;
		M3DM_Header *_header_;
		M3DM_Data _data_;
};

}


