#include "units.h"

#include <QProcess>
#include <QTextStream>

Units* Units::instance = NULL;

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

Units::Units()
{
    units = new QVector<Units2>();
    list_units_names = new QStringList();
    generateUnits();
}

void Units::generateUnits() {

    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 + " -lu");
    proj_cmd->waitForFinished();
    QTextStream output (proj_cmd->readAllStandardOutput());

    // PARSE DATUMS OUTPUT
    QString *line = new QString();
    QString *unit_identifier = new QString();
    QString *unit_description = new QString();
    QString *unit_ratio = new QString();
    QString *tmp2 = new QString();
    Units2 *unit = new Units2();

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

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

        output2 >> *unit_identifier;
        unit->setIdentifier(*unit_identifier);
        output2 >> *unit_ratio;
        unit->setRatio(*unit_ratio);

        while(!output2.atEnd())
        {
            output2 >> *tmp2;
            *unit_description += " ";
            *unit_description += *tmp2;
        }
        unit->setLabel(*unit_description);
        list_units_names->append(*unit_description);
        units->push_back(*unit);
    }
}

QVector<Units2> *Units::getUnits(){
    return units;
}

QString Units::findUnit(QString Unit_description){

    for(QVector<Units2>::iterator i=units->begin();i!=units->end();i++)
    {
        if(i->getLabel()==Unit_description)
        {
            return i->getIdentifier();
        }
    }
    throw "Unit not found";
}

Units2 Units::begin(){
    return *units->begin();
}

Units2 Units::end(){
    return *units->end();
}
/*
bool Units::operator= (Units Units){


    return this->Units == Units;
}

bool Units::operator!= (Units Units){
    return !(this->Units == Units);
}
*/
int Units::size(){
    return units->size();
}

QStringList *Units::getDescriptions(){
    return list_units_names;
}
