#ifndef ONIX_PARSER_H
#define ONIX_PARSER_H

using namespace std;

#include <QFile>
#include <QXmlStreamReader>
#include <iostream>
#include <QThread>
#include <QTextStream>
#include "AbstractOnixParserEventHandler.h"

class OnixParser: public QThread
{			
	public:
		enum ParserError{NoError, FileNotPresentError, NoReadPermissionError, NoWritePermissionsError, XmlReaderError};
	
	private:
		QFile* m_inputFile;
		QFile* m_outputFile;
		QTextStream* out;
		QXmlStreamReader* reader;
		AbstractOnixParserEventHandler* m_handler;
		ParserError onixParserError;
			
		
		void init()
		{		
			if (!m_inputFile->open(QIODevice::ReadOnly | QIODevice::Text))
			{
				onixParserError = NoReadPermissionError;
        return;
			}
			
			if(!m_inputFile->exists())
			{
				onixParserError = FileNotPresentError;
				return;
			}	
			
			if (!m_outputFile->open(QIODevice::WriteOnly | QIODevice::Text))
			{
				onixParserError = NoWritePermissionsError;
        return;
      }
      
			out = new QTextStream(m_outputFile);
			reader = new QXmlStreamReader(m_inputFile);
			onixParserError = NoError;
			
			
		}
		
	public:
		OnixParser(QString inputFile, QString outputFile, AbstractOnixParserEventHandler* handler):
			m_inputFile(new QFile(inputFile)), m_outputFile(new QFile(outputFile)), m_handler(handler)
		{
			init();
		}
			
		int countInputFileLines(QXmlStreamReader* reader)
		{
			qint64 ammountOfLines=0;
			while (!reader->atEnd())
			{
       reader->readNext();       
       ammountOfLines++;
 			}
			reader->clear();
			return ammountOfLines;
		} 
		
		ParserError parserError()
		{
			return onixParserError;
		}		
		
	private:	
		
		void run()
		{
			m_handler->printStatusMessage("entered run()");
			
			qint64 currentLine=0;
			while (!reader->atEnd())
			{
			 if((reader->readNext() == QXmlStreamReader::StartElement) && (reader->name().toString()=="product"))
			 {
			 	*out<<endl;
			 }
			 else
			 {
			 	if(reader->isCharacters())
			 	{
			 		*out<<reader->text().toString().trimmed()<<";";
			 	}
			 }
			 currentLine++;
 			}

 			if (reader->hasError()) 
 			{
				onixParserError = XmlReaderError;	
 			}
 			 			
 			out->flush();
 			m_outputFile->flush();
 			m_outputFile->close();
 			m_inputFile->close();
		}
};
#endif

