#include "yacreader_libraries.h"
#include "yacreader_global.h"

YACReaderLibraries::YACReaderLibraries()
    : QObject()
{
}

YACReaderLibraries::YACReaderLibraries(const YACReaderLibraries &source)
    : QObject(), libraries(source.libraries)
{
}

QList<QString> YACReaderLibraries::getNames()
{
    return libraries.keys();
}

QString YACReaderLibraries::getPath(const QString &name)
{
    return libraries.value(name).second;
}

QString YACReaderLibraries::getPath(int id)
{
    foreach (QString name, libraries.keys())
        if (libraries.value(name).first == id)
            return libraries.value(name).second;
    return "";
}

QString YACReaderLibraries::getDBPath(int id)
{
    return getPath(id) + "/.yacreaderlibrary";
}

QString YACReaderLibraries::getName(int id)
{
    foreach (QString name, libraries.keys())
        if (libraries.value(name).first == id)
            return name;
    return "";
}

bool YACReaderLibraries::isEmpty()
{
    return libraries.isEmpty();
}

bool YACReaderLibraries::contains(const QString &name)
{
    return libraries.contains(name);
}

bool YACReaderLibraries::contains(int id)
{
    foreach (QString name, libraries.keys())
        if (libraries.value(name).first == id)
            return true;
    return false;
}

void YACReaderLibraries::remove(const QString &name)
{
    libraries.remove(name);
}

void YACReaderLibraries::rename(const QString &oldName, const QString &newName)
{
    if (libraries.contains(oldName)) {
        QPair<int, QString> value = libraries.value(oldName);
        libraries.remove(oldName);
        libraries.insert(newName, value);
    }
}

int YACReaderLibraries::getId(const QString &name)
{
    return libraries.value(name).first;
}

YACReaderLibraries &YACReaderLibraries::operator=(const YACReaderLibraries &source)
{
    libraries = source.libraries;
    return *this;
}

QMap<QString, QPair<int, QString>> YACReaderLibraries::getLibraries()
{
    return libraries;
}

void YACReaderLibraries::addLibrary(const QString &name, const QString &path)
{
    int newID = 0;
    foreach (QString lName, libraries.keys())
        newID = qMax(newID, libraries.value(lName).first);
    newID++;
    libraries.insert(name, QPair<int, QString>(newID, path));
}

void YACReaderLibraries::load()
{
    QSettings settings(YACReader::getSettingsPath() + "/" + QCoreApplication::applicationName() + ".ini", QSettings::IniFormat);

    if (settings.value(LIBRARIES).isValid()) {
        QByteArray data = settings.value(LIBRARIES).toByteArray();
        QDataStream in(&data, QIODevice::ReadOnly);
        in >> libraries;
    } else // only for compatibility with old versions (<7.0)
    {
        QFile f(QCoreApplication::applicationDirPath() + "/libraries.yacr");
        f.open(QIODevice::ReadOnly);
        QTextStream txtS(&f);
        QString content = txtS.readAll();
        QStringList lines = content.split('\n');
        QString line, name;
        int i = 0;

        foreach (line, lines) {
            if ((i % 2) == 0)
                name = line;
            else
                addLibrary(name.trimmed(), line.trimmed());
            i++;
        }
        f.close();
        if (save())
            f.remove();
    }
}

bool YACReaderLibraries::save()
{
    QSettings settings(YACReader::getSettingsPath() + "/" + QCoreApplication::applicationName() + ".ini", QSettings::IniFormat);

    QByteArray data;
    QDataStream out(&data, QIODevice::WriteOnly);
    out << libraries;
    settings.setValue(LIBRARIES, data);

    return settings.isWritable();
}
