#ifndef CLODHANDLER_H
#define CLODHANDLER_H

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include "zlib.h"
#include "../nodrze.h"
#include "SDL.h"


class CDefHandler;
class CDefEssential;

enum Epcxformat {PCX8B, PCX24B};

namespace NLoadHandlerHelp
{
	const int dmHelp=0, dmNoExtractingMask=1;
	//std::string P1,P2,CurDir;
	const int fCHUNK = 50000;
};

struct Entry
{
	unsigned char name[12], //filename
		hlam_1[4], //
		hlam_2[4]; //
	std::string nameStr;
	int offset, //from beginning
		realSize, //size without compression
		size;	//and with
	bool operator<(const std::string & comp) const
	{
		return nameStr<comp;
	}
	bool operator<(const Entry & comp) const
	{
		return nameStr<comp.nameStr;
	}
	Entry(std::string con): nameStr(con){};
	//Entry(unsigned char ): nameStr(con){};
	Entry(){};
};
class CPCXConv
{	
public:
	unsigned char * pcx, *bmp;
	int pcxs, bmps;
	void fromFile(std::string path);
	void saveBMP(std::string path);
	void openPCX(char * PCX, int len);
	void openPCX();
	void convert();
	SDL_Surface * getSurface();
	CPCXConv(){pcx=bmp=NULL;pcxs=bmps=0;};
	~CPCXConv(){if (pcxs) delete[] pcx; if(bmps) delete[] bmp;}
};
class CLodHandler
{
private:
	FILE* FLOD;
public:
	nodrze<Entry> entries;
	unsigned int totalFiles;

	int readNormalNr (unsigned char* bufor, int bytCon, bool cyclic=false); //lod header reading helper
	int decompress (unsigned char * source, int size, int realSize, std::ofstream & dest); //main decompression function
	int decompress (unsigned char * source, int size, int realSize, std::string & dest); //main decompression function
	int infm(FILE *source, FILE *dest, int wBits = 15); //zlib handler
	int infs(unsigned char * in, int size, int realSize, std::ofstream & out, int wBits=15); //zlib fast handler
	int infs2(unsigned char * in, int size, int realSize, unsigned char*& out, int wBits=15); //zlib fast handler
	std::vector<CDefHandler *> extractManyFiles(std::vector<std::string> defNamesIn); //extrats given files (defs only)
	CDefHandler * giveDef(std::string defName);
	CDefEssential * giveDefEss(std::string defName);
	std::string getTextFile(std::string name); //extracts one file
	void extract(std::string FName);
	void extractFile(std::string FName, std::string name); //extracts a specific file
	void init(std::string lodFile);
	SDL_Surface * loadBitmap(std::string fname);
};

#endif //CLODHANDLER_H