// Squawk messenger. 
// Copyright (C) 2019  Yury Gubich <blue@macaw.me>
// 
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// 
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

#include "about.h"
#include "ui_about.h"
#include <QXmppGlobal.h>
#include <QDebug>

static const std::string QXMPP_VERSION_PATCH(std::to_string(QXMPP_VERSION & 0xff));
static const std::string QXMPP_VERSION_MINOR(std::to_string((QXMPP_VERSION & 0xff00) >> 8));
static const std::string QXMPP_VERSION_MAJOR(std::to_string(QXMPP_VERSION >> 16));
static const QString QXMPP_VERSION_STRING = QString::fromStdString(QXMPP_VERSION_MAJOR + "." + QXMPP_VERSION_MINOR + "." + QXMPP_VERSION_PATCH);

About::About(QWidget* parent):
    QWidget(parent),
    m_ui(new Ui::About),
    license(nullptr)
{
    m_ui->setupUi(this);
    m_ui->versionValue->setText(QApplication::applicationVersion());
    m_ui->qtVersionValue->setText(qVersion());
    m_ui->qtBuiltAgainstVersion->setText(tr("(built against %1)").arg(QT_VERSION_STR));

    m_ui->qxmppVersionValue->setText(QXmppVersion());
    m_ui->qxmppBuiltAgainstVersion->setText(tr("(built against %1)").arg(QXMPP_VERSION_STRING));

    setWindowFlag(Qt::Tool);

    connect(m_ui->licenceLink, &QLabel::linkActivated, this, &About::onLicenseActivated);
}

About::~About() {
    if (license != nullptr) {
        license->deleteLater();
    }
};

void About::onLicenseActivated()
{
    if (license == nullptr) {
        QFile file;
        bool found = false;
        QStringList shares = QStandardPaths::standardLocations(QStandardPaths::AppDataLocation);
        for (const QString& path : shares) {
            file.setFileName(path + "/LICENSE.md");

            if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
                found = true;
                break;
            }
        }
        if (!found) {
            qDebug() << "couldn't read license file, bailing";
            return;
        }

        license = new QWidget();
        license->setWindowTitle(tr("License"));
        QVBoxLayout* layout = new QVBoxLayout(license);
        QLabel* text = new QLabel(license);
        QScrollArea* area = new QScrollArea(license);
        text->setTextFormat(Qt::MarkdownText);
        text->setWordWrap(true);
        text->setOpenExternalLinks(true);
        text->setMargin(5);
        area->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);

        layout->addWidget(area);
        license->setAttribute(Qt::WA_DeleteOnClose);
        connect(license, &QWidget::destroyed, this, &About::onLicenseClosed);

        QTextStream in(&file);
        QString line;
        QString licenseText("");
        while (!in.atEnd()) {
            line = in.readLine();
            licenseText.append(line + "\n");
        }
        text->setText(licenseText);
        file.close();

        area->setWidget(text);

    } else {
        license->raise();
        license->activateWindow();
    }

    license->show();
}

void About::onLicenseClosed()
{
    license = nullptr;
}