#include "datums.h"
#include <QProcess>
#include <QTextStream>

Datums* Datums::instance = NULL;


Datums* Datums::getInstance()
{
    if(!instance)
        instance = new Datums();
    return instance;
}

Datums::Datums()
{
    datums = new QVector<Datum>();
    list_datums_names = new QStringList();
    generateDatums();
}

void Datums::generateDatums() {

    //QVector<Datum> Datums;

    QString proj_dir;
    QProcess *ini = new QProcess();
    ini->start("which proj");
    ini->waitForFinished();
    if(ini->exitCode()==1)
    {
        throw "proj not found";
    }
    else
    {
        proj_dir = ini->readAllStandardOutput();
    }

    QProcess *proj_cmd = new QProcess();
    proj_cmd->start(proj_dir + " -ld");
    proj_cmd->waitForFinished();
    QTextStream output (proj_cmd->readAllStandardOutput());

    // PARSE DATUMS OUTPUT
    QString *line = new QString();
    QString *datum_identifier = new QString();
    QString *datum_description = new QString();
    QString *datum_ellipsoiod = new QString();
    QString *tmp2 = new QString();
    Datum *dat = new Datum();

    while(!output.atEnd())
    {
        *line = output.readLine(0); //READ LINE --- first line remove
        *line = output.readLine(0);
        datum_description->clear();   //CLEAR DESCRIPTION

        //PARSE ONE LINE (ONE ELLIPSOID)
        QTextStream output2 (line); //RETYPE STRING TO STREAM

        output2 >> *datum_identifier;
        dat->setIdentifier(*datum_identifier);
        output2 >> *datum_ellipsoiod;
        dat->setEllipsoid(*datum_ellipsoiod);

        while(!output2.atEnd())
        {
            output2 >> *tmp2;
            *datum_description += " ";
            *datum_description += *tmp2;
        }
        dat->setDescription(*datum_description);
        list_datums_names->append(*datum_identifier);
        datums->push_back(*dat);
    }
}

QVector<Datum> *Datums::getDatums(){
    return datums;
}

QString Datums::findDatum(QString datum_description){

    for(QVector<Datum>::iterator i=datums->begin();i!=datums->end();i++)
    {
        if(i->getIdentifier()==datum_description)
        {
            return i->getIdentifier();
        }
    }
    throw "Datum not found";
}

Datum Datums::begin(){
    return *datums->begin();
}

Datum Datums::end(){
    return *datums->end();
}

int Datums::size(){
    return datums->size();
}

QStringList *Datums::getDescriptions(){
    return list_datums_names;
}
