#ifndef LOADER_H
#define LOADER_H

#include <QDomDocument>
#include <QFile>
#include <QTextStream>
#include <QXmlSchema>
#include <QXmlSchemaValidator>
#include "game_data.h"

struct tbAlien
{
	int id;
	QString name;
	float speed;
	float health;
	float armor;
	float regeneration;
	bool isFlying;
	unsigned int score;
	int imgType;
	unsigned int prise;
};

struct tbSplash
{
	int id;
	QString name;
	float speed;
	unsigned int lifetime;
	bool autoControl;
	int imgType;
};

struct tbTrigger
{
	enum triggerType
	{
		onDestination,
		onTimer,
		onAlienInRadius
	};

	enum aimType
	{
		noAim,
		parentAim,
		allSide,
		nearlestAlien
	};
	int id;
	QString name;
	float damage;
	float radius;
	int chance;
	bool delParent;
	aimType childAim;
	triggerType type;
	unsigned int timer;
	int count;
	float randomPosRadius;
};

struct tbTower
{
	int id;
	QString name;
	float radius;
	unsigned int cost;
	unsigned int reload;
	unsigned int buildTime;
	float expByShot;
	float expByKill;
	float expByDamage;
	int splashId;
	int imgType;
};

struct tbChain
{
	int towerId;
	int parentSplashId;
	int childSplashId;
	int triggerId;
};

struct tbUpgrade
{
	int towerId;
	int triggerId;
	unsigned int cost;
	float towRadius;
	unsigned int towReload;
	float trigDamage;
	float trigDamageRadius;
};

struct tbMorph
{
	int fromId;
	int toId;
	int cost;
	float expRequired;
};

struct tbWavePart
{
	int waveId;
	int alienId;
	unsigned int count;
};

struct tbWave
{
	int id;
	unsigned int timeout;
	unsigned int prise;
	//int type;
};

struct tbWaveOnLevel
{
	int levelId;
	int waveId;
};

struct tbMap
{
	int id;
	QString name;
	unsigned int maxPlayers;
	//QVector < QVector <int> > cells;
	QByteArray data;
	QSize size;
	int imgType;
};

struct tbTowerOnLevel
{
	int levelId;
	int towerId;
	//int enableWaveId;
};

struct tbLevel
{
	int id;
	QString name;
	int mapId;
	unsigned int score;
};


class Loader : public QObject
{
	Q_OBJECT
public:
	explicit Loader(QObject *parent = 0);
	//void create();
	void save(QString filename);
	void load(QString filename);
	Game_Data * loadlevel(int id);

	QHash <int,tbAlien> aliens;
	QHash <int,tbMap> maps;
	QHash <int,tbLevel> levels;
	QHash <int,tbSplash> splashes;
	QHash <int,tbTower> towers;
	QHash <int,tbTrigger> triggers;
	QHash <int,tbWave> waves;
	QMultiHash <int,tbWaveOnLevel> levWaves;
	QMultiHash <int,tbWavePart> waveParts;
	QMultiHash <int,tbChain> chains;
	QMultiHash <int,tbMorph> morphs;
	QMultiHash <int,tbTowerOnLevel> levTowers;
	QMultiHash <int,tbUpgrade> upgrades;

signals:

public slots:

private:
	QDomDocument * doc;
	QFile * file;

	void readAliens();
	void readMaps();
	void readLevels();
	void readMorphs();
	void readSplashes();
	void readTowers();
	void readLevTowers();
	void readTriggers();
	void readChains();
	void readWaves();
	void readLevWaves();
	void readWaveParts();
	void readUpgrades();

	void validate(QString filename);
	QString CreateMapExample();
};

#endif // LOADER_H
