#include <QCryptographicHash>
#include <QByteArray>

#include "o0settingsstore.h"

static quint64 getHash(const QString &encryptionKey) {
    return QCryptographicHash::hash(encryptionKey.toLatin1(), QCryptographicHash::Sha1).toULongLong();
}

O0SettingsStore::O0SettingsStore(const QString &encryptionKey, QObject *parent):
    O0AbstractStore(parent), crypt_(getHash(encryptionKey)) {
    settings_ = new QSettings(this);
}

O0SettingsStore::O0SettingsStore(QSettings *settings, const QString &encryptionKey, QObject *parent):
    O0AbstractStore(parent), crypt_(getHash(encryptionKey)) {
    settings_ = settings;
    settings_->setParent(this);
}

QString O0SettingsStore::groupKey() const {
    return groupKey_;
}

void O0SettingsStore::setGroupKey(const QString &groupKey) {
    if (groupKey_ == groupKey) {
        return;
    }
    groupKey_ = groupKey;
    Q_EMIT groupKeyChanged();
}

QString O0SettingsStore::value(const QString &key, const QString &defaultValue) {
    QString fullKey = groupKey_.isEmpty() ? key : (groupKey_ + '/' + key);
    if (!settings_->contains(fullKey)) {
        return defaultValue;
    }
    return crypt_.decryptToString(settings_->value(fullKey).toString());
}

void O0SettingsStore::setValue(const QString &key, const QString &value) {
    QString fullKey = groupKey_.isEmpty() ? key : (groupKey_ + '/' + key);
    settings_->setValue(fullKey, crypt_.encryptToString(value));
}
