/*
 * This file is part of smolbote. It's copyrighted by the contributors recorded
 * in the version control history of the file, available from its original
 * location: https://neueland.iserlohn-fortress.net/gitea/aqua/smolbote
 *
 * SPDX-License-Identifier: GPL-3.0
 */

#include "downloaditemwidget.h"
#include "ui_downloaditemform.h"
#include <QStyle>
#include <QUrl>
#include <QDesktopServices>
#include <QBuffer>

inline QString sizeString(int size)
{
    if(size < 1024) {
        return QString("%1 bytes").arg(size);
    }
    // KiB
    if(size < 1024 * 1024) {
        return QString("%1 kB").arg(size / 1024);
    }
    // MiB
    if(size < 1024 * 1024 * 1024) {
        return QString("%1 MB").arg(size / (1024 * 1024));
    }
    // GiB
    return QString("%1 GB").arg(size / (1024 * 1024 * 1024));
}

DownloadItemWidget::DownloadItemWidget(QWebEngineDownloadItem *item, QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::DownloadItemForm)
{
    Q_CHECK_PTR(item);
    this->item = item;
    ui->setupUi(this);
    {
        // pause/resume icons
        QIcon pauseIcon;
        pauseIcon.addPixmap(style()->standardPixmap(QStyle::SP_MediaPlay), QIcon::Normal, QIcon::Off);
        pauseIcon.addPixmap(style()->standardPixmap(QStyle::SP_MediaPause), QIcon::Normal, QIcon::On);
        ui->pause_toolButton->setIcon(pauseIcon);

        ui->abort_toolButton->setIcon(style()->standardIcon(QStyle::SP_MediaStop));
    }

    ui->url_label->setText(item->url().toString());
    ui->path_label->setText(item->path());

    this->updateState(item->state());
    connect(item, &QWebEngineDownloadItem::stateChanged, this, &DownloadItemWidget::updateState);
    connect(item, &QWebEngineDownloadItem::downloadProgress, this, &DownloadItemWidget::updateProgress);
    connect(item, &QWebEngineDownloadItem::finished, this, &DownloadItemWidget::updateFinished);

    connect(ui->abort_toolButton, &QToolButton::clicked, item, &QWebEngineDownloadItem::cancel);
    connect(ui->pause_toolButton, &QToolButton::clicked, item, [item](bool clicked) {
        if(clicked) {
            item->pause();
        } else {
            item->resume();
        }
    });
    connect(ui->open_toolButton, &QToolButton::clicked, item, [item]() {
        QDesktopServices::openUrl(QUrl::fromLocalFile(item->path()));
    });
}

DownloadItemWidget::~DownloadItemWidget()
{
    delete ui;
}

void DownloadItemWidget::updateState(QWebEngineDownloadItem::DownloadState state)
{
    switch(state) {
    case QWebEngineDownloadItem::DownloadRequested:
        ui->status_label->setText(tr("Requested"));
        ui->pause_toolButton->setEnabled(true);
        ui->abort_toolButton->setEnabled(true);
        ui->open_toolButton->setEnabled(false);
        break;
    case QWebEngineDownloadItem::DownloadInProgress:
        ui->status_label->setText(tr("In progress"));
        ui->pause_toolButton->setEnabled(true);
        ui->abort_toolButton->setEnabled(true);
        ui->open_toolButton->setEnabled(false);
        break;
    case QWebEngineDownloadItem::DownloadCompleted:
        ui->status_label->setText(tr("Completed"));
        ui->pause_toolButton->setEnabled(false);
        ui->abort_toolButton->setEnabled(false);
        ui->open_toolButton->setEnabled(true);
        break;
    case QWebEngineDownloadItem::DownloadCancelled:
        ui->status_label->setText(tr("Cancelled"));
        ui->pause_toolButton->setEnabled(false);
        ui->abort_toolButton->setEnabled(false);
        ui->open_toolButton->setEnabled(false);
        break;
    case QWebEngineDownloadItem::DownloadInterrupted:
        ui->status_label->setText(tr("Interrupted"));
        ui->pause_toolButton->setEnabled(false);
        ui->abort_toolButton->setEnabled(false);
        ui->open_toolButton->setEnabled(false);
        break;
    default:
        break;
    }
}

void DownloadItemWidget::updateProgress(qint64 value, qint64 total)
{
    ui->progressBar->setMaximum(total);
    ui->progressBar->setValue(value);
    ui->progressBar->setFormat(QString("%1 / %2").arg(sizeString(value), sizeString(total)));
}

void DownloadItemWidget::updateFinished()
{
    ui->progressBar->setValue(ui->progressBar->maximum());
    ui->pause_toolButton->hide();
    ui->abort_toolButton->hide();
    ui->open_toolButton->show();

    // generate a useful tooltip
    QString tooltip = "<p><b>URL</b>: %1</p>"
                      "<p><b>Path</b>: %2</p>"
                      "<p><b>MIME Type</b>: %3</p>"
                      "<p><b>Size</b>: %4</p>";
    tooltip = tooltip.arg(item->url().toString(), item->path(), item->mimeType(), sizeString(item->totalBytes()));

    if(item->mimeType().startsWith("image")) {
        const QPixmap pixmap(item->path());
        const QPixmap thumbnail = pixmap.scaledToWidth(qMax(400, pixmap.width()), Qt::SmoothTransformation);

        QByteArray imageData;
        QBuffer buffer(&imageData);
        thumbnail.save(&buffer, "PNG");

        tooltip = QString("<table>"
                          "<tr><th>Preview</th><th>Information</th></tr>"
                          "<tr><td>%1</td><td>%2</td></tr>"
                          "</table>").arg(QString("<img src='data:image/png;base64," + imageData.toBase64() + "' width='400' alt='preview'>"),
                                          tooltip);

    }

    setToolTip(tooltip);
}