#include "export-ao.h"

#include <QClipboard>
#include <QGuiApplication>
#include <QMessageBox>

#include "branchitem.h"
#include "mainwindow.h"
#include "task.h"
#include "vymmodel.h"

extern QString vymName;
extern Main *mainWindow;
extern Settings settings;

ExportAO::ExportAO()
{
    exportName = "AO";
    filter = "TXT (*.txt);;All (* *.*)";
    caption = vymName + " -" + QObject::tr("Export as AO report") + " " +
              QObject::tr("(still experimental)");
    indentPerDepth = "   ";
    bulletPoints.clear();
    for (int i = 0; i < 10; i++)
        bulletPoints << "-";
}

void ExportAO::doExport()
{
    QFile file(filePath);
    if (!file.open(QIODevice::WriteOnly)) {
        QMessageBox::critical(
            0, QObject::tr("Critical Export Error"),
            QObject::tr("Could not export as AO to %1").arg(filePath));
        mainWindow->statusMessage(QString(QObject::tr("Export failed.")));
        return;
    }

    settings.setLocalValue(model->getFilePath(), "/export/last/command",
                           "exportAO");
    settings.setLocalValue(model->getFilePath(), "/export/last/description",
                           "A&O report");

    QString out;

    // Main loop over all branches
    QString s;
    QString curIndent;
    QString dashIndent;

    int i;
    BranchItem *cur = nullptr;
    BranchItem *prev = nullptr;

    model->nextBranch(cur, prev);
    while (cur) {
        QString line;
        QString colString = "";
        QString noColString;
        QString statusString = "";
        QColor col;

        if (cur->getType() == TreeItem::Branch ||
            cur->getType() == TreeItem::MapCenter) {
            // Make indentstring
            curIndent = indent(cur->depth() - 4, true);

            if (!cur->hasHiddenParent()) {
                col = cur->headingColor();
                if (col == QColor(255, 0, 0))
                    colString = "[R] ";
                else if (col == QColor(217, 81, 0))
                    colString = "[O] ";
                else if (col == QColor(0, 85, 0))
                    colString = "[G] ";
                else if (cur->depth() == 4)
                    colString = " *  ";
                else
                    colString = "    ";

                noColString = QString(" ").repeated(colString.length());

                dashIndent = "";
                switch (cur->depth()) {
                case 0:
                    break; // Mapcenter (Ignored)
                case 1:
                    break; // Mainbranch "Archive" (Ignored)
                case 2:    // Title: "Current week number..."
                    out += "\n";
                    out += underline(cur->headingPlain(), QString("="));
                    out += "\n";
                    break;
                case 3: // Headings: "Achievement", "Bonus", "Objective", ...
                    out += "\n";
                    out += underline(cur->headingPlain(), "-");
                    out += "\n";
                    break;
                default: // depth 4 and higher are the items we need to know
                    Task *task = cur->getTask();
                    if (task) {
                        // Task status overrides other flags
                        switch (task->getStatus()) {
                        case Task::NotStarted:
                            statusString = "[NOT STARTED]";
                            break;
                        case Task::WIP:
                            statusString = "[WIP]";
                            break;
                        case Task::Finished:
                            statusString = "[DONE]";
                            break;
                        }
                    }
                    else {
                        if (cur->hasActiveFlag("hook-green"))
                            statusString = "[DONE]";
                        else if (cur->hasActiveFlag("wip"))
                            statusString = "[WIP]";
                        else if (cur->hasActiveFlag("cross-red"))
                            statusString = "[NOT STARTED]";
                    }

                    line += colString;
                    line += curIndent;
                    if (cur->depth() > 3)
                        line += cur->headingPlain();

                    // Pad line width before status
                    i = 80 - line.length() - statusString.length() - 1;
                    for (int j = 0; j < i; j++)
                        line += " ";
                    line += " " + statusString + "\n";

                    out += line;

                    // If necessary, write URL
                    if (!cur->url().isEmpty())
                        out += noColString + indent(cur->depth() - 4, false) +
                               cur->url() + "\n";

                    // If necessary, write note
                    if (!cur->isNoteEmpty()) {
                        curIndent = noColString +
                                    indent(cur->depth() - 4, false) + "| ";
                        s = cur->getNoteASCII(curIndent, 80);
                        out += s + "\n";
                    }
                    break;
                }
            }
        }
        model->nextBranch(cur, prev);
    }

    QTextStream ts(&file);
    ts << out;
    file.close();

    QClipboard *clipboard = QGuiApplication::clipboard();
    clipboard->setText(out);

    displayedDestination = filePath;

    result = ExportBase::Success;

    completeExport();
}

QString ExportAO::underline(const QString &text, const QString &line)
{
    QString r = text + "\n";
    for (int j = 0; j < text.length(); j++)
        r += line;
    return r;
}
