#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <qfile.h>
#include <qfiledialog.h>
#include <qtextstream.h>

//Структура для массивов
struct myList{
    QString key;
    QString value;
};
//Массив для хранения списка из файла .csv
QList<myList*> csvList;
//Массив для хранения списка из файла .json
QList<myList*> jsonList;
//Словарь для преобразования оффсета в число
QMap<QString, int> offsetConvert = { {"double", 8}, {"int", 4}, {"bool", 1} };

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //Вывод начальной информации в текстбраузер
    ui->textBrowser->setText("1. Open a .csv file\n\n"
                             "2. Select Tag\n\n"
                             "3. Open a .json file\n\n"
                             "4. Export result\n\n");
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_csvOpen_clicked()
{
    csvList.clear();
    int i=0;
    ui->comboBox->clear();

    //Функция выбора файла .csv
    QString fileName = QFileDialog::getOpenFileName(this, tr("Open .csv file"), "", tr(".csv (*.csv)"));
    QFile file(fileName);
    file.open(QIODevice::ReadOnly);

    //Цикл на чтение файла построчно, пока он не закончится
    while (!file.atEnd()){
        QString inputLine = file.readLine();

        //Разделение строки на слова, разделитель - ;
        auto inputParts = inputLine.split(";", Qt::SkipEmptyParts);

        //Пропуск строки с заголовками
        if (inputParts[0]=="Tag"){
            continue;
        }

        //Заполнение массива
        csvList.append(new myList);
        csvList[i]->key=inputParts[0];
        csvList[i]->value=inputParts[1];
        ui->comboBox->addItem(inputParts[0]);
        i++;

    }
    file.close();
    ui->jsonOpen->setEnabled(true);
}

void MainWindow::on_jsonOpen_clicked()
{
    jsonList.clear();
    ui->textBrowser->clear();

    bool matches=0; //Переменная для нахождения начала списка аргументов
    int offset=0; //Переменная для накопления оффсета
    int k=0; //Указатель на элемент массива
    QString findValue; //Переменная для хранения типа

    //Поиск в массиве тега и соответствующего ему типа
    QString findKey = ui->comboBox->currentText();
    for (int i=0;i<csvList.size();i++){
        if (csvList[i]->key==findKey)
            findValue = csvList[i]->value;
    }

    //Выбор файла .json и открытие в режиме чтения
    QString fileName = QFileDialog::getOpenFileName(this, tr("Open .json file"), "", tr(".json (*.json)"));
    QFile file(fileName);
    file.open(QIODevice::ReadOnly);

    //Цикл чтения файла
    while(!file.atEnd()){

        //Построчное чтение .json файла и удаление из строки всех пробельных символов
        QString findString = file.readLine();
        findString.remove(QRegExp("\\s+"));

        //Если найден нужный тип, переменная будет равна 1
        if (findString.contains(findValue)){
            matches=1;
        }

        //Если нужный тип найден, начинается обработка строк
        else if (matches){

            //Если при чтении массива находится одиночный символ } - выход
            if (findString=="}"){
                break;
            }

            //Разбиение строки на слова с отбросом всех символов не слова
            auto parts = findString.split(QRegExp("\\W+"), Qt::SkipEmptyParts);

            //Если в строке менее 2 подстрок - пропуск строки
            if (parts.size()<2){
                continue;
            }

            //Заполнение массива и текстбраузера значениями
            jsonList.append((new myList));
            jsonList[k]->key=findKey+"."+parts[0];
            jsonList[k]->value=QVariant(offset).toString();
            k++;
            offset += offsetConvert.value(parts[1]);
            ui->textBrowser->append(findKey+"."+parts[0]);
        }
    }
    ui->exportButton->setEnabled(true);
}

void MainWindow::on_exportButton_clicked()
{
    //Создание файла в корне с программой. Открытие в режиме записи
    QFile file("output.xml");
    file.open(QIODevice::WriteOnly);
    QTextStream writeStream(&file);

    //Запись всего массива в файл построчно
    writeStream << "<root>\n";
    for(int i=0;i<jsonList.size();i++){
        writeStream << "<item Binding='Introduced'>\n";
        writeStream << "    <node-path>"+jsonList[i]->key+"</node-path>\n";
        writeStream << "    <address>"+jsonList[i]->value+"</address>\n";
        writeStream << "</item>\n";
    }
    writeStream << "</root>\n";
    file.close();

    ui->textBrowser->clear();
    ui->textBrowser->setText("Done!\n"
                             "Result saved to output.xml");
}