#include "skin.h"
#include "aconfig.h"
#include "filesystem.h"
#include "mainwindow.h"

#include <QPushButton>
#include <QString>
#include <QDesktopWidget>
#include <QApplication>
#include <QLabel>
#include <QBitmap>
#include <QMovie>

Skin::Skin(QObject *parent) : QObject(parent) {

}

QString Skin::getSkinFile(){
    QString current_theme = QApplication::applicationDirPath() + "/styles/" + AConfig::getInstance()->getValue("Global", "current_theme") + "/skin.ini";
    QString default_theme = QApplication::applicationDirPath() + "/styles/" + AConfig::getInstance()->getValue("Global", "default_theme") + "/skin.ini";
    QString skinfile = FileSystem::fileExists(current_theme) ? current_theme : default_theme;
    return skinfile;
}

QString Skin::getSkinName(){
    QString current_theme = AConfig::getInstance()->getValue("Global", "current_theme");
    QString default_theme = AConfig::getInstance()->getValue("Global", "default_theme");
    QString path = QApplication::applicationDirPath() + "/styles/" + current_theme + "/skin.ini";
    QString skinname = FileSystem::fileExists(path) ? current_theme : default_theme;
    return skinname;
}

void Skin::loadSkin(){
    qInfo("Загружаем скин лаунчера");
    qInfo("%s:%i: %s", __FILE__, __LINE__, "Определяем активную тему оформления");
    QSettings settings( getSkinFile(), QSettings::IniFormat );
    QStringList items = settings.childGroups();
    QVariant k;
    QPushButton butt;
    QLabel lab;
    qInfo("%s:%i: %s", __FILE__, __LINE__, "Начинаем настройку элементов");

    foreach (QString item, items){
        qInfo("%s:%i: %s%s", __FILE__, __LINE__, "Устанавливаем настройки для ", item.toStdString().c_str());
        MainWindow *a = MainWindow::getInstance();
        QWidget* obj = a->findChild<QWidget*>(item);
        if (obj != nullptr){
            obj->installEventFilter(MainWindow::getInstance());
            settings.beginGroup(item);
            if(settings.value("left").toString() != "-1"){
                obj->setGeometry(QRect(
                    settings.value("left").toInt(),
                    settings.value("top").toInt(),
                    settings.value("width").toInt(),
                    settings.value("height").toInt()
                ));
            }

            qInfo("%s:%i: %s%s", __FILE__, __LINE__, item.toStdString().c_str(), ": настройка геометрии завершена");

            if(settings.value("shadow") != k){
                QString color = settings.value("shcolor") != k ? settings.value("shcolor").toString() : "#222";
                int blur = settings.value("shblur") != k ? settings.value("shblur").toInt() : 2;
                int offset_x = settings.value("shx") != k ? settings.value("shx").toInt() : 1;
                int offset_y = settings.value("shy") != k ? settings.value("shy").toInt() : 1;
                MainWindow::getInstance()->applyShadow(obj, color, blur, offset_x, offset_y);
            }
            qInfo("%s:%i: %s%s", __FILE__, __LINE__, item.toStdString().c_str(), ":  настройка теней завершена");

            if(settings.value("text") != k){
                QString text = settings.value("text").toString();
                if(text == "del") text = "";
                if(obj->metaObject()->className() == butt.metaObject()->className()){
                   QPushButton * b = dynamic_cast<QPushButton* >(obj);
                   b->setText(text);
                }


                if(obj->metaObject()->className() == lab.metaObject()->className()){
                   QLabel * l = dynamic_cast<QLabel* >(obj);
                   l->setText(settings.value("text").toString());
                }
                qInfo("%s:%i: %s%s", __FILE__, __LINE__, item.toStdString().c_str(), ": текст установлен");
            }

            if(settings.value("align") != k){
                QLabel * lab = dynamic_cast<QLabel* >(obj);
                if(settings.value("align") == "left") lab->setAlignment(Qt::AlignLeft);
                if(settings.value("align") == "center") lab->setAlignment(Qt::AlignCenter);
                if(settings.value("align") == "right") lab->setAlignment(Qt::AlignRight);
            }
            qInfo("%s:%i: %s%s", __FILE__, __LINE__, item.toStdString().c_str(), ": настройки позиционирования применены");

            settings.endGroup();
        } else  {
            if(item == "mainWindow") {
                settings.beginGroup(item);
                qInfo("%s:%i: %s%s", __FILE__, __LINE__, item.toStdString().c_str(), ": обработка параметров главного окна");
                int w = settings.value("width").toInt();
                int h = settings.value("height").toInt();

                QDesktopWidget desktop;
                QRect rect = desktop.availableGeometry(desktop.primaryScreen()); // прямоугольник с размерами экрана
                QPoint center = rect.center(); //координаты центра экрана
                int x = center.x() - (w / 2);  // учитываем половину ширины окна
                int y = center.y() - (h / 2); // .. половину высоты
                center.setX(x);
                center.setY(y);
                MainWindow::getInstance()->move(center);
                settings.endGroup();
            }
            qInfo("%s:%i: %s%s", __FILE__, __LINE__, item.toStdString().c_str(), ": закончен просчет геометрии");

            if(item == "htmlColors") {
                settings.beginGroup(item);
                foreach(QString key, settings.allKeys()){
                   MainWindow::getInstance()->htmlColors.insert(key, settings.value(key).toString());
                }
                settings.endGroup();
            }
            qInfo("%s:%i: %s%s", __FILE__, __LINE__, item.toStdString().c_str(), ": загружены HTML-цвета");
        }
    }
    qInfo("%s:%i: %s", __FILE__, __LINE__, "Выполнено.");
}

void Skin::findSkins(){
    qInfo("Темы оформления");
    qInfo("%s:%i: %s", __FILE__, __LINE__, "Производим поиск доступных тем.");
    QDir dir(QApplication::applicationDirPath() + "/styles");
    QStringList skins = dir.entryList(QDir::Dirs | QDir::AllDirs | QDir::NoDotAndDotDot);
    MainWindow::getInstance()->ui->skinSelect->addItems(skins);
    QString skinname = AConfig::getInstance()->getValue("Global", "current_theme");
    MainWindow::getInstance()->ui->skinSelect->setCurrentText(skinname);

    qInfo("%s:%i: %s", __FILE__, __LINE__, "Устанавливаем отметку о файле локализации.");
    QString file = AConfig::getInstance()->getValue("Local", "file");
    if(file == "client_local_English.dat") MainWindow::getInstance()->ui->enButton->setEnabled(false);
    if(file == "client_local_DE.dat") MainWindow::getInstance()->ui->deButton->setEnabled(false);
    if(file == "client_local_FR.dat") MainWindow::getInstance()->ui->frButton->setEnabled(false);
    qInfo("%s:%i: %s", __FILE__, __LINE__, "Выполнено.");
}

void Skin::replaceSkin(QString name){
    QString text = "Смена темы оформления";
    QString info = "Выбрана тема " + name + ". Изменения вступят в силу при следующем запуске лаунчера.";
    //app->helper->myDialogBox(text, info, "OK", "Отмена", "gandalf.png", "", "", 400, 120, true, false);

    qInfo("%s:%i: %s", __FILE__, __LINE__, "Оформляем главное окно.");

    QFile styleF;
    QString skin = getSkinName();
    styleF.setFileName(QApplication::applicationDirPath() + "styles/" + name + "/style.css");
    styleF.open(QFile::ReadOnly);
    QString qssStr = styleF.readAll();

    qApp->setStyleSheet(qssStr);

    QPixmap maskPix(":/res/styles/" + name + "/bg.png");
    QPixmap maskPixLocal(QApplication::applicationDirPath() + "styles/" + name + "/bg.png");
    maskPix = maskPix.isNull() ? maskPixLocal : maskPix;
    MainWindow::getInstance()->setMask(maskPix.mask());

    QString color = MainWindow::getInstance()->htmlColors.contains("a") ? MainWindow::getInstance()->htmlColors.lowerBound("a").value() : "blue";
    loadSkin();
    QString hrefcolor = MainWindow::getInstance()->htmlColors.contains("a") ? MainWindow::getInstance()->htmlColors.lowerBound("a").value() : "blue";

    QString newtext = MainWindow::getInstance()->ui->news1Title->text().replace(color, hrefcolor);
    MainWindow::getInstance()->ui->news1Title->setText(newtext);

    newtext = MainWindow::getInstance()->ui->news2Title->text().replace(color, hrefcolor);
    MainWindow::getInstance()->ui->news2Title->setText(newtext);

    newtext = MainWindow::getInstance()->ui->news3Title->text().replace(color, hrefcolor);
    MainWindow::getInstance()->ui->news3Title->setText(newtext);

    newtext = MainWindow::getInstance()->ui->news4Title->text().replace(color, hrefcolor);
    MainWindow::getInstance()->ui->news4Title->setText(newtext);

    MainWindow::getInstance()->loadHelp();

    QMovie * movie = new QMovie(":/res/styles/" + skin + "/loader.gif");
    if(!movie->isValid()) movie = new QMovie(QApplication::applicationDirPath() + "styles/" + skin + "/loader.gif");
    MainWindow::getInstance()->ui->loader->setMovie(movie);
    movie->setScaledSize(QSize(MainWindow::getInstance()->ui->loader->width(), MainWindow::getInstance()->ui->loader->height()));
    movie->start();
}
