/*
 * This file is part of smolbote. It's copyrighted by the contributors recorded
 * in the version control history of the file, available from its original
 * location: https://neueland.iserlohn-fortress.net/cgit/smolbote
 *
 * SPDX-License-Identifier: GPL-3.0
 */

#include "settingstable.h"
#include <QResizeEvent>
#include <QSettings>
#include <QToolButton>

SettingsTable::SettingsTable(QWidget *parent)
    : QTableWidget(parent)
{
    QObject::connect(this, &QTableWidget::currentCellChanged, [this](int currentRow, int currentColumn, int /*previousRow*/, int /*previousColumn*/) {
        if(currentColumn == 0) {
            const auto key = item(currentRow, currentColumn)->text();
            m_selectedKey = key;
        }
    });

    addBtn = new QToolButton(this);
    addBtn->setText("Add");
    removeBtn = new QToolButton(this);
    removeBtn->setText("Remove");
}

void SettingsTable::connect(QSettings *settings, const QString &section)
{
    settings->beginGroup(section);
    if(settings != nullptr) {
        const auto keys = settings->childKeys();
        setRowCount(keys.count());
        for(int i = 0; i < keys.count(); ++i) {
            setItem(i, 0, new QTableWidgetItem(keys[i]));
            setItem(i, 1, new QTableWidgetItem(settings->value(keys[i]).toString()));
        }
    }
    settings->endGroup();

    QObject::connect(addBtn, &QToolButton::clicked, [this]() {
        const auto row = rowCount();
        setRowCount(row + 1);
        setItem(row, 0, new QTableWidgetItem("key"));
        setItem(row, 1, new QTableWidgetItem("value"));
    });

    QObject::connect(removeBtn, &QToolButton::clicked, settings, [this, settings, section]() {
        settings->beginGroup(section);

        const int row = currentRow();
        const auto key = item(row, 0)->text();

        removeRow(row);
        qDebug("remove key: %s", qUtf8Printable(key));
        settings->remove(key);

        settings->endGroup();
    });

    QObject::connect(this, &QTableWidget::cellChanged, settings, [this, settings, section](int row, int column) {
        // no value has been created yet
        if(item(row, 1) == nullptr) {
            return;
        }

        settings->beginGroup(section);

        if(column == 0) {
            qDebug("remove old key: %s", qUtf8Printable(m_selectedKey));
            settings->remove(m_selectedKey);
        }

        const auto key = item(row, 0)->text();
        const auto val = item(row, 1)->text();
        qDebug("set: [%s]=[%s]", qUtf8Printable(key), qUtf8Printable(val));
        settings->setValue(key, val);

        settings->endGroup();
    });
}

void SettingsTable::resizeEvent(QResizeEvent *event)
{
    QTableWidget::resizeEvent(event);
    addBtn->move(width() - addBtn->width() - removeBtn->width(), 0);
    removeBtn->move(width() - removeBtn->width(), 0);
}