/*
 * TestXML.c
 *
 *  Created on: Dec 19, 2010
 *      Author: blackpanther
 */

#include <stdio.h>
#include <stdlib.h>

#include <string.h>

#include "configuration.h"

#include "logger.h"
#include "utilities.h"

#include "result.h"
#include "user.h"
#include "group.h"
#include "problema.h"

#define XML_PROBLEM_FILE       "xml-problem"
#define XML_USER_FILE          "xml-user"
#define XML_GROUP_FILE         "xml-group"
#define XML_SIMPLE_RESULT_FILE "xml-simple-result"
#define XML_BENCH_RESULT_FILE  "xml-benchmark-result"

int main(int argc, char** argv) {
	ResultArray *results = NULL;
	User        *user    = NULL;
	Group       *group   = NULL;
	Problema    *problem = NULL;

	xmlConfig_t * config;

	resetToDefaultLogger();
	setLoggerLevel(ALL);

	char *xmlFile;

	int i;

	// Chargement du fichier et initialisation
	config = loadConfiguration("resources/test-XML.xml");

	if (!config) {
		logMessage(SEVERE, "configuration file",
				"resources/test-XML.xml not found");
		return -1;
	}

	logMessage(INFO, "test suite", "launch");

	//read data from input file
	xmlFile = getProperty(config, XML_SIMPLE_RESULT_FILE);
	if (xmlFile) {
		logMessage(DEBUG1, "xml simple    result file fetched", xmlFile);

		//Result
		logMessage(INFO, "parsing", "simple result xml");
		results = (ResultArray *) parseResultFromFile(&(xmlFile[0]));

		logMessage(INFO, "number of result", integerToString(results->size));
		if (results->benchId > 0)
			logMessage(INFO, "bench id", integerToString(results->benchId));
		for (i = 0; i < results->size; i++) {
			logMessage(INFO, "result", results->result[i]->display(
					results->result[i]));
		}

		//Output
		printf("simple result xml : \n%s\n", (char *) writeResultXML(results));
		for (i = 0; i < results->size; i++) {
			destroyResult(results->result[i]);
		}

		free(xmlFile);
	}

	//Benchmark
	xmlFile = getProperty(config, XML_BENCH_RESULT_FILE);
	if (xmlFile) {
		logMessage(DEBUG1, "xml benchmark result file fetched",
				xmlFile);

		logMessage(INFO, "parsing", "benchmark result xml");
		results = (ResultArray *) parseResultFromFile(&(xmlFile[0]));

		logMessage(INFO, "number of result", integerToString(results->size));
		if (results->benchId > 0)
			logMessage(INFO, "bench id", integerToString(results->benchId));
		for (i = 0; i < results->size; i++) {
			logMessage(INFO, "result", results->result[i]->display(
					results->result[i]));
		}

		//Output
		printf("benchmark xml : \n%s\n", (char *) writeResultXML(results));
		for (i = 0; i < results->size; i++) {
			destroyResult(results->result[i]);
		}

		free(xmlFile);
	}

	//User
	xmlFile = getProperty(config, XML_USER_FILE);
	if (xmlFile) {
		logMessage(DEBUG1, "xml user file fetched",
				xmlFile);

		logMessage(INFO, "parsing", "user xml");
		user = (User *) parseUserFromFile(xmlFile);

		printf("user data : \n%s\n",user->display(user));

		//Output
		printf("user xml : \n%s\n", (char *) writeUserXML(user));

		destroyUser(user);

		free(xmlFile);
	}

	//Group
	xmlFile = getProperty(config, XML_GROUP_FILE);
	if (xmlFile) {
		logMessage(DEBUG1, "xml group file fetched",
				xmlFile);

		logMessage(INFO, "parsing", "group xml");
		group = (Group *) parseGroupFromFile(xmlFile);

		printf("group data : \n%s\n",group->display(group));

		//Output
		printf("group xml : \n%s\n", (char *) writeGroupXML(group));

		destroyGroup(group);

		free(xmlFile);
	}

	//Problem
	xmlFile = getProperty(config, XML_PROBLEM_FILE);
	if (xmlFile) {
		logMessage(DEBUG1, "xml problem file fetched",
				xmlFile);

		logMessage(INFO, "parsing", "problem xml");
		problem = (Problema *) parseProblemFromFile(xmlFile);

		printf("problem data : \n%s\n",problem->display(problem));

		//Output
		printf("problem xml : \n%s\n", (char *) writeProblemXML(problem));

		destroyProblema(problem);

		free(xmlFile);
	}

	logMessage(DEBUG1, "destroy", "config");
	destroyConfig(config);

	logMessage(INFO, "exiting", "");
	return (EXIT_SUCCESS);
}

