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

Ellipsoids* Ellipsoids::instance = NULL;

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

Ellipsoids::Ellipsoids()
{
    ellipsoids = new QVector<Ellipsoid>();
    list_ellips_names = new QStringList();
    generateEllipsoids();
}

void Ellipsoids::generateEllipsoids() {

    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 = new QProcess();
    proj->start(proj_dir + " -le");
    proj->waitForFinished();

    QTextStream output (proj->readAllStandardOutput());

    // PARSE ELLIPSOIDS OUTPUT
    QString *line = new QString();
    QString *ellipsoid_name = new QString();
    QString *description = new QString();
    QString *tmp2 = new QString();
    Ellipsoid *ell = new Ellipsoid();

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

        //PARSE ONE LINE (ONE ELLIPSOID)
        QTextStream output2 (line); //RETYPE STRING TO STREAM
        output2 >> *ellipsoid_name;
        ell->setName(*ellipsoid_name);

        while(!output2.atEnd())
        {
            output2 >> *tmp2;
            if(tmp2->startsWith("a="))
            {
                ell->setOsaA(tmp2->mid(2));
            }
            else if(tmp2->startsWith("b="))
            {
                ell->setOsaB(tmp2->mid(2));
            }
            else if(tmp2->startsWith("rf="))
            {
                ell->setRF(tmp2->mid(3));
            }
            else
            {
                *description += " "; // MUSI TO TU BYT - vzhledem k trideni (sort) ve widgetu ???
                *description += *tmp2;
            }
        }
        //std::cout << description << std::endl; // MMYY
        ell->setDescription(*description);
        list_ellips_names->append(*description);
        ellipsoids->push_back(*ell);
    }
}

Ellipsoid Ellipsoids::begin(){
    return *ellipsoids->begin();
}

Ellipsoid Ellipsoids::end(){
    return *ellipsoids->end();
}

QString Ellipsoids::findEllipsoid(QString ellipsoid_label){

    for(QVector<Ellipsoid>::iterator i=ellipsoids->begin();i!=ellipsoids->end();i++)
    {
        if(i->getDescription()==ellipsoid_label)
        {
            return i->getName();
        }
    }
    return false;
}

int Ellipsoids::size(){
    return ellipsoids->size();
}


QStringList *Ellipsoids::getDescriptions(){
    return list_ellips_names;
}

void Ellipsoids::addEllipsoid(Ellipsoid ell)
{
    ellipsoids->push_back(ell);
}

void Ellipsoids::addDescription(QString description)
{
    list_ellips_names->append(description);
}
