// loadingwidget.cpp
#include "loadingwidget.h"

#include <QApplication>
#include <QLabel>
#include <QMovie>
#include <QResizeEvent>
#include <QScreen>
#include <QVBoxLayout>

#include "mainwindow.h"

LoadingWidget* LoadingWidget::m_instance = nullptr;

LoadingWidget::LoadingWidget(QWidget* parent) : QWidget(parent) { initUI(); }

LoadingWidget* LoadingWidget::instance() {
    if (!m_instance) {
        m_instance = new LoadingWidget();
    }
    return m_instance;
}

void LoadingWidget::showLoading(QWidget* parent, const QString& text) {
    LoadingWidget* instance = LoadingWidget::instance();

    // 如果提供了parent，则设置parent
    // if (parent) {
    //     instance->setParent(parent);
    // }

    instance->m_textLabel->setText(text);
    instance->m_movie->start();
    instance->updatePosition();
    instance->show();
    instance->raise();
}

void LoadingWidget::hideLoading() {
    if (m_instance) {
        m_instance->m_movie->stop();
        m_instance->hide();
    }
}

void LoadingWidget::initUI() {
    // 设置窗口属性
    setWindowFlags(Qt::FramelessWindowHint | Qt::SubWindow);
    setAttribute(Qt::WA_TranslucentBackground);
    setAttribute(Qt::WA_ShowWithoutActivating);

    // 创建动画
    m_movie = new QMovie(":/icons/icons/loading.gif");
    m_loadingLabel = new QLabel(this);
    m_loadingLabel->setMovie(m_movie);
    m_loadingLabel->setAlignment(Qt::AlignCenter);

    // 创建文本标签
    m_textLabel = new QLabel(this);
    m_textLabel->setAlignment(Qt::AlignCenter);

    // 布局
    QVBoxLayout* layout = new QVBoxLayout(this);
    layout->addWidget(m_loadingLabel);
    layout->addWidget(m_textLabel);
    layout->setSpacing(10);
    layout->setContentsMargins(50, 80, 50, 50);

    // 样式
    setStyleSheet("background-color: rgba(255, 255, 255, 0.8); border-radius: 0px;");
    m_textLabel->setStyleSheet("color: white; font-size: 16px;");

    // 初始隐藏
    hide();
}

void LoadingWidget::resizeEvent(QResizeEvent* event) {
    QWidget::resizeEvent(event);
    updatePosition();
}

void LoadingWidget::updatePosition() {
    if (parentWidget()) {
        // 居中显示在父窗口
        QRect parentRect = parentWidget()->rect();
        resize(parentRect.size());
        move(parentRect.center() - rect().center());
    } else {
        // 如果没有父窗口，居中显示在屏幕
        QRect screenGeometry = QApplication::primaryScreen()->geometry();
        resize(1024, 768);
        move(screenGeometry.center() - rect().center());
    }
}

void LoadingWidget::init(QStackedWidget* stackedWidget) {
    LoadingWidget* instance = LoadingWidget::instance();
    if (stackedWidget) {
        instance->setParent(stackedWidget);
        instance->updatePosition();
    }
}