#include "mainwindow.h"
#include <QApplication>
#include <QDebug>
#include <QDesktopWidget>
#include <QFileInfo>
#include <QHBoxLayout>
#include <QStandardPaths>
#include <QToolBar>
#include <QVBoxLayout>

#define USERDATA_SETTING_CFG "/userdata/setting.cfg"
#define HOME_SETTING_CFG QStandardPaths::writableLocation(QStandardPaths::HomeLocation) + "/setting.cfg"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)  
{
    const QRect availableGeometry = QApplication::desktop()->availableGeometry(this);
    resize(availableGeometry.width(), availableGeometry.height());
    setMinimumWidth(availableGeometry.width());

    audio = nullptr;
    wifi = nullptr;
    bt = nullptr;
    update = nullptr;
    factoryReset = nullptr;

    getConfig();

    returnBtn.setStyleSheet(tr("border-image: url(:/return.png);"));
    QPixmap pixmap(":/return.png");
    returnBtn.setFixedSize(pixmap.width(), pixmap.height());

    QFont font;
    title.setText("Setting");
    font.setPixelSize(availableGeometry.height()/20);
    title.setFont(font);
    title.setAlignment(Qt::AlignLeft);


    QHBoxLayout *hlayout = new QHBoxLayout;
    hlayout->addWidget(&returnBtn);
    hlayout->addWidget(&title);
    hlayout->addWidget(&subTitle);
    hlayout->addWidget(&toggleBtn);
    font.setPixelSize(pixmap.height()*1/3);
    subTitle.setFont(font);
    subTitle.setAlignment(Qt::AlignCenter);
    subTitle.setVisible(false);
    font.setPixelSize(pixmap.height()/2);
    toggleBtn.setFont(font);
    toggleBtn.setFixedSize(pixmap.width(), pixmap.height());
    toggleBtn.setVisible(false);

    font.setPixelSize(availableGeometry.height()/20);
//    QListWidgetItem *audio = new QListWidgetItem(tr("Audio"), &listWidget);
//    audio->setFont(font);
    QListWidgetItem *wifi = new QListWidgetItem(tr("WiFi"), &listWidget);
    wifi->setFont(font);
    QListWidgetItem *bt = new QListWidgetItem(tr("BT"), &listWidget);
    bt->setFont(font);
    QListWidgetItem *update = new QListWidgetItem(tr("Update"), &listWidget);
    update->setFont(font);
    QListWidgetItem *factory = new QListWidgetItem(tr("Factory Reset"), &listWidget);
    factory->setFont(font);
    listWidget.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    listWidget.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

    stack.addWidget(&listWidget);
    stack.setCurrentIndex(0);

    QWidget *hWidget = new QWidget;
    hWidget->setLayout(hlayout);

    QVBoxLayout *vlayout = new QVBoxLayout;
    vlayout->addWidget(hWidget);
    vlayout->addWidget(&stack);

    QWidget *vWidget = new QWidget;
    vWidget->setLayout(vlayout);
    setCentralWidget(vWidget);
    setStyleSheet("background-color:rgb(204,228,247)");
    setWindowState(Qt::WindowMaximized);
    setWindowFlags(Qt::FramelessWindowHint);

    connect(&listWidget, SIGNAL(itemClicked(QListWidgetItem *)), this, SLOT(on_itemClicked(QListWidgetItem *)));
    connect(&returnBtn, SIGNAL(clicked(bool)), this, SLOT(on_returnClicked()));
}

MainWindow::~MainWindow()
{

}

QString MainWindow::saveConfig(int volume, int wifi, int bt)
{
    QString path;
    QFileInfo fi("/userdata");
    if(fi.isDir()){
        path = USERDATA_SETTING_CFG;
    }else {
        path = HOME_SETTING_CFG;
    }
    QFile file(path);

    if(! file.open(QIODevice::ReadWrite | QIODevice::Text)){
        qDebug() << "open rw setting.cfg failed";
        return nullptr;
    }
    QTextStream out(&file);
    out << "volume = " + QString::number(volume) << endl;
    out << "isWifiOn = " + QString::number(wifi) << endl;
    out << "isBtOn = " + QString::number(bt) << endl;
    out.flush();
    file.close();
    return path;
}

int MainWindow::getValue(QTextStream *in, QString text)
{
    in->seek(0);
    do {
        QString temp = in->readLine();
        if(temp.startsWith(text)){
            int size = text.count();
            QString result = temp.mid(size, temp.count());
            return result.toInt();
        }
    }while (! in->atEnd());

    return -1;
}

void MainWindow::getConfig()
{
    QString path;

    if(QFile::exists(USERDATA_SETTING_CFG)){
        path = USERDATA_SETTING_CFG;
    }else if(QFile::exists(HOME_SETTING_CFG)){
        path = HOME_SETTING_CFG;
    }else {
        path = saveConfig(100, 0, 0);
    }

    QFile file(path);
    if(! file.open(QIODevice::ReadOnly | QIODevice::Text)){
        qDebug() << "open ro setting.cfg failed";
        return;
    }
    QTextStream in(&file);
    volume = getValue(&in, "volume = ");
    isWifiOn = getValue(&in, "isWifiOn = ");
    isBtOn = getValue(&in, "isBtOn = ");
}


void MainWindow::on_itemClicked(QListWidgetItem *item)
{
    title.setText(item->text());

    if(! item->text().compare("Audio")){
        audio = new qtAudio(this);
        stack.addWidget(audio);
        stack.setCurrentIndex(stack.indexOf(audio));
    } else if(! item->text().compare("WiFi")){
        wifi = qtWifi::getInstance(this, &subTitle, &toggleBtn, isWifiOn);
        stack.addWidget(wifi);
        stack.setCurrentIndex(stack.indexOf(wifi));
    } else if(! item->text().compare("BT")){
        bt = qtBT::getInstance(this, &subTitle, &toggleBtn, isBtOn);
        stack.addWidget(bt);
        stack.setCurrentIndex(stack.indexOf(bt));
    } else if(! item->text().compare("Update")){
        update = new qtUpdate(this);
        stack.addWidget(update);
        stack.setCurrentIndex(stack.indexOf(update));
    } else if(! item->text().compare("Factory Reset")){
        factoryReset = new qtFactoryReset(this);
        stack.addWidget(factoryReset);
        stack.setCurrentIndex(stack.indexOf(factoryReset));
    }
}

void MainWindow::on_returnClicked()
{
    if(title.text() == "Setting"){
        if(bt){
            isBtOn = bt->isOn();
            delete bt;
            bt = nullptr;
        }
        saveConfig(volume, isWifiOn, isBtOn);
        qApp->exit(0);
    }else {
        title.setText("Setting");
        if(audio){
            stack.removeWidget(audio);
            delete audio;
            audio = nullptr;
        }else if(wifi){
            stack.removeWidget(wifi);
            isWifiOn = wifi->isOn();
            delete wifi;
            wifi = nullptr;
        }else if(bt){
            stack.removeWidget(bt);
            isBtOn = bt->isOn();
            delete bt;
            bt = nullptr;
        }else if(update){
            stack.removeWidget(update);
            delete update;
            update = nullptr;
        }else if(factoryReset){
            stack.removeWidget(factoryReset);
            delete factoryReset;
            factoryReset = nullptr;
        }
        stack.setCurrentIndex(stack.indexOf(&listWidget));
    }
}