#include "lhstylemanager.h"
#include <QCoreApplication>
#include <QStyle>
#include <QDir>
#include <QDebug>

LHStyleManager* LHStyleManager::m_instance = nullptr;
QMutex LHStyleManager::m_mtx;

LHStyleManager::LHStyleManager(QObject *parent) : QObject(parent), m_bQss(true)
{
    m_nCurStyle = eBrightStyle;
#ifdef QT_NO_DEBUG
    QssToSkin();
#endif
}

LHStyleManager::~LHStyleManager()
{
    if(m_instance) {
        delete m_instance;
    }
}

LHStyleManager *LHStyleManager::Instance()
{
    if (nullptr == m_instance) {
        QMutexLocker lock(&m_mtx);
        if (nullptr == m_instance) {
            m_instance = new LHStyleManager;
        }
    }
    return m_instance;
}
/**
 * @brief 有个隐患:如果widget在外面已经销毁,此处不会消除,导致List越来越大
 * @param widget
 */
void LHStyleManager::AddWidget(QWidget *widget)
{
    if(widget != nullptr && !m_widgetList.contains(widget)) {
        m_widgetList.append(widget);
        UpdateWidgetStyle(widget);
    } else {
        UpdateWidgetStyle(widget);
    }
}

bool LHStyleManager::UpdateWidgetStyle(QWidget *widget)
{
    if(widget == nullptr) {
        return false;
    }
    QString strBasePath = QCoreApplication::applicationDirPath();
    QString strStylePath;
    QString strName = widget->objectName();
    if(m_nCurStyle == eBrightStyle) {
        strStylePath = "skin/Bright";
    } else if(m_nCurStyle == eDarkStyle) {
        strStylePath = "skin/Dark";
    }
    // 从文件加载样式
    QString strStyleFile = strBasePath + QString("/%1/%2.%3").arg(strStylePath, strName, m_bQss ? "qss" : "skin");
    //qInfo() << strStyleFile;
    // 从资源加载样式,缺点每次需要重新编译才生效
    //QString strStyleFile = QString(":/%1/%2.qss").arg(strStylePath).arg(strName);
    QFile file(strStyleFile);
    if (file.open(QIODevice::ReadOnly)) {
        QByteArray arrStyle = file.readAll();
        widget->setStyleSheet(m_bQss ? arrStyle : qUncompress(arrStyle));
        file.close();
        return true;
    }
    return false;
}

void LHStyleManager::QssToSkin(bool reserve)
{
    // 遍历skin文件夹,存在qss就压缩成skin文件,并删除qss文件
    QString skinPath(QString("%1/skin/%2/").arg(QCoreApplication::applicationDirPath(), GetCurSkinName()));
    QDir directory(skinPath);
    if (!directory.exists()) {
        //qWarning("目录不存在: %s", qPrintable(skinPath));
        return;
    }

    QStringList filters;
    if (!reserve) {
        filters << "*.qss";
    } else {
        filters << "*.shin";
    }

    QStringList fileNames = directory.entryList(filters, QDir::Files);
    for (const QString& fileName : fileNames) {
        QString filePath = directory.absoluteFilePath(fileName);
        QFile qssFile(filePath);
        if (!qssFile.open(QIODevice::ReadOnly)) {
            //qWarning("打开Qss文件失败: %s", qPrintable(filePath));
            continue;
        }

        QString skinFilePath = filePath;
        if (!reserve) {
            skinFilePath.replace(".qss", ".skin");
        } else {
            skinFilePath.replace(".skin", ".qss");
        }

        QFile skinFile(skinFilePath);
        if (!skinFile.open(QIODevice::WriteOnly)) {
            //qWarning("创建文件失败: %s", qPrintable(skinFilePath));
            qssFile.close();
            continue;
        }

        QByteArray strQss = qssFile.readAll();

        skinFile.write(reserve ? qUncompress(strQss) : qCompress(strQss));
        qssFile.close();
        skinFile.close();

        if (!QFile::remove(filePath)) {
            //qWarning("移除文件失败: %s", qPrintable(filePath));
        }
    }
    m_bQss = reserve;
}


void LHStyleManager::SetSkinStyle(const QString& style)
{
    if (style.isEmpty()) return;
    SkinStyle skin{SkinStyle::eBrightStyle};
    if (!style.compare("Bright")) {
        skin = SkinStyle::eBrightStyle;
    } else if (!style.compare("Dark")) {
        skin = SkinStyle::eDarkStyle;
    }
    if(m_nCurStyle == skin) {
        return;
    }

    m_nCurStyle = skin;
    for(int i = 0; i < m_widgetList.size(); i++) {
        QWidget* widget = m_widgetList.at(i);
        if(widget == nullptr) continue;
        UpdateWidgetStyle(widget);
    }
}