/*********************************************************************************************
 * Mozilla License
 * Just a meantime project to see the ability of qt, the framework that my OS might be based on
 * And for those linux users that believe in the power of notes
 *********************************************************************************************/

#ifndef UPDATERWINDOW_H
#define UPDATERWINDOW_H

#include <QDialog>
#include <QDir>

namespace Ui {
class UpdaterWindow;
}

class QMouseEvent;
class QNetworkReply;
class QSimpleUpdater;
class QNetworkAccessManager;

// UpdaterWindow 类用于管理更新窗口的显示和更新逻辑
class UpdaterWindow : public QDialog
{
    Q_OBJECT

public:
    // 构造函数，初始化更新窗口
    explicit UpdaterWindow(QWidget *parent = 0);
    // 析构函数，释放资源
    ~UpdaterWindow();

    // 设置是否显示更新窗口
    void setShowWindowDisable(const bool dontShowWindow);

public slots:
    // 检查更新，force 参数表示是否强制检查
    void checkForUpdates(bool force);

signals:
    // 信号，当更新窗口显示状态改变时发出
    void dontShowUpdateWindowChanged(bool state);

private slots:
    // 重置控件状态
    void resetControls();
    // 更新标题标签
    void updateTitleLabel();
    // 当有可用更新时调用
    void onUpdateAvailable();
    // 当下载按钮被点击时调用
    void onDownloadButtonClicked();
    // 开始下载，url 参数表示下载链接
    void startDownload(const QUrl &url);
    // 打开下载的文件，file 参数表示文件路径
    void openDownload(const QString &file);
    // 当检查更新完成时调用，url 参数表示检查的链接
    void onCheckFinished(const QString &url);
    // 当 xdg-open 命令完成时调用，exitCode 参数表示退出码
    void onXdgOpenFinished(const int exitCode);
    // 打开下载文件夹，file 参数表示文件路径
    void openDownloadFolder(const QString &file);
    // 计算下载大小，received 参数表示已接收的字节数，total 参数表示总字节数
    void calculateSizes(qint64 received, qint64 total);
    // 更新下载进度，received 参数表示已接收的字节数，total 参数表示总字节数
    void updateProgress(qint64 received, qint64 total);
    // 计算剩余下载时间，received 参数表示已接收的字节数，total 参数表示总字节数
    void calculateTimeRemaining(qint64 received, qint64 total);
    // 当下载完成时调用
    void onDownloadFinished();

protected:
    // 处理鼠标移动事件
    void mouseMoveEvent(QMouseEvent *event) override;
    // 处理鼠标按下事件
    void mousePressEvent(QMouseEvent *event) override;
    // 处理鼠标释放事件
    void mouseReleaseEvent(QMouseEvent *event) override;

private:
    // 四舍五入函数，input 参数表示输入值
    qreal round(qreal input);

private:
    QString m_fileName; // 文件名
    const QDir m_downloadDir; // 下载目录

    Ui::UpdaterWindow *m_ui; // 用户界面指针

    QPoint m_dragPosition; // 窗口拖动位置

    int m_mousePressX; // 鼠标按下时的 X 坐标
    int m_mousePressY; // 鼠标按下时的 Y 坐标
    bool m_canMoveWindow; // 是否可以移动窗口
    bool m_checkingForUpdates; // 是否正在检查更新
    bool m_dontShowUpdateWindow; // 是否不显示更新窗口
    bool m_forced; // 是否强制检查更新

    uint m_startTime; // 下载开始时间
    QNetworkReply *m_reply; // 网络回复指针
    QSimpleUpdater *m_updater; // 更新器指针
    QNetworkAccessManager *m_manager; // 网络访问管理器指针
};

#endif