#include "task.h"

#include <QDebug>

#include "branchitem.h"
#include "taskmodel.h"
#include "vymmodel.h"


Task::Task(TaskModel *tm)
{
//    qDebug()<<"Constr. Task";
    status=NotStarted;
    awake=Task::WideAwake;
    branch=NULL;
    prio='X';
    model=tm;
    date_creation=QDateTime::currentDateTime();
    date_sleep=QDate::currentDate();
}

Task::~Task()
{
//    qDebug()<<"Destr. Task";
    if (branch) branch->setTask (NULL);
}

void Task::setModel (TaskModel* tm)
{
    model=tm;
}

void Task::cycleStatus(bool reverse)
{
    if (awake==Morning)
    {
	setAwake (WideAwake);
	return;
    }
    int i=status;
    reverse ?  i-- : i++;

    if (i<0) i=2;
    if (i>2) i=0;

    setStatus ( (Task::Status) i );

    if (branch) branch->updateTaskFlag ();
}

void Task::setStatus(const QString &s)
{
    if (s=="NotStarted")
	setStatus(NotStarted);
    else if (s=="WIP")
	setStatus(WIP);
    else if (s=="Finished")
	setStatus(Finished);
    else
	qWarning()<<"Task::setStatus Unknown value: "<<s;
}

void Task::setStatus(Status s)
{
    if (s==status) return;
    status=s;
    if (branch) branch->updateTaskFlag();
}

Task::Status Task::getStatus()
{
    return status;
}

QString Task::getStatusString()	    
{
    switch (status)
    {
	case NotStarted: return "NotStarted";
	case WIP: return "WIP";
	case Finished: return "Finished";
    }
    return "Undefined";
}

QString Task::getIconString()
{
    QString s;
    switch (status) 
    {
        case NotStarted: 
            s="task-new";
            break;
        case WIP: 
            s="task-wip";
            break;
        case Finished: 
            s="task-finished";
        break;
    }
    if (status != Finished)
        switch (awake) 
        {
            case Sleeping: 
                s+="-sleeping";
                break;
            case Morning: 
                s+="-morning";
                break;
            default: break;
        }
    return s;
}

void Task::setAwake(const QString &s)
{
    if (s=="Sleeping")
	setAwake(Sleeping);
    else if (s=="Morning")
	setAwake(Morning);
    else if (s=="WideAwake")
	setAwake(WideAwake);
    else
	qWarning()<<"Task::setAwake Unknown value: "<<s;
}

void Task::setAwake(Task::Awake a)
{
    if (a==awake) return;
    awake=a;
    recalcAwake();
    if (branch) branch->updateTaskFlag();
}

Task::Awake Task::getAwake()
{
    return awake;
}

QString Task::getAwakeString()	    
{
    switch (getAwake() )
    {
	case Sleeping: return "Sleeping";
	case Morning: return "Morning";
	case WideAwake: return "WideAwake";
    }
    return "Undefined";
}

void Task::recalcAwake()
{
    if ( getDaysSleep() <= 0 && awake==Task::Sleeping)
	setAwake(Task::Morning);
}

void Task::setPriority (int p)
{
    prio=p;
}

int Task::getPriority()
{
    return prio;
}

int Task::getAgeCreation()
{
    return date_creation.daysTo (QDateTime::currentDateTime() );
}

int Task::getAgeModified()
{
    if (date_modified.isValid() )
	return date_modified.daysTo (QDateTime::currentDateTime() );
    else
	return getAgeCreation();
}

void Task::setDateCreation (const QString &s)
{
    date_creation=QDateTime().fromString (s,Qt::ISODate);
}


void Task::setDateModified()
{
    date_modified=QDateTime::currentDateTime();
}

void Task::setDateModified(const QString &s)
{
    date_modified=QDateTime().fromString (s,Qt::ISODate);
}

void Task::setDateSleep(int n)
{
    setDateSleep ( QDate::currentDate().addDays (n).toString(Qt::ISODate) );
}

void Task::setDateSleep(const QString &s)
{
    date_sleep=QDate().fromString (s,Qt::ISODate);
    if (getDaysSleep()>0) 
	setAwake(Sleeping);
    else
	setAwake (Morning);
}

int Task::getDaysSleep()
{
    int d=0;
    if (date_sleep.isValid() )
	d=QDate::currentDate().daysTo (date_sleep);
    return d;
}

void Task::setBranch (BranchItem *bi)
{
    branch=bi;
    mapName=bi->getModel()->getMapName();
}

BranchItem* Task::getBranch ()
{
    return branch;
}

QString Task::getName ()
{
    if (branch)
	return branch->getHeading();
    else
    {
	qWarning()<<"Task::getName  no branch!";
	return "UNDEFINED";
    }
}

QString Task::getMapName ()
{
    return mapName;
}

QString Task::saveToDir()
{
    QString sleepAttr;
    if (getDaysSleep()>0)
	sleepAttr = attribut ("date_sleep",date_sleep.toString (Qt::ISODate) );
    return singleElement ("task",
	attribut ("status",getStatusString() ) +
	attribut ("awake",getAwakeString() ) +
	attribut ("date_creation",date_creation.toString (Qt::ISODate) ) +
	attribut ("date_modified",date_modified.toString (Qt::ISODate) ) +
	sleepAttr
     );
}

