// Squawk messenger. 
// Copyright (C) 2019  Yury Gubich <blue@macaw.me>
// 
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// 
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

#include "clientcache.h"

#include <QDebug>

Core::ClientCache::ClientCache():
    db("clients"),
    cache(db.addCache<QString, Shared::ClientInfo>("info")),
    requested(),
    specific()
{
    db.open();
}

Core::ClientCache::~ClientCache() {
    db.close();
}

void Core::ClientCache::open() {
    db.open();}

void Core::ClientCache::close() {
    db.close();}

bool Core::ClientCache::checkClient(const Shared::ClientId& p_id) {
    QString id = p_id.getId();
    if (requested.count(id) == 0 && !cache->checkRecord(id)) {
        requested.emplace(id, p_id);
        emit requestClientInfo(id);
        return false;
    }

    return true;
}

bool Core::ClientCache::registerClientInfo (
    const QString& sourceFullJid,
    const QString& id,
    const std::set<Shared::Identity>& identities,
    const std::set<QString>& features)
{
    std::map<QString, Shared::ClientInfo>::iterator itr = requested.find(id);
    if (itr != requested.end()) {
        Shared::ClientInfo& info = itr->second;
        info.identities = identities;
        info.extensions = features;

        bool valid = info.valid();
        if (valid) {
            cache->addRecord(id, info);
        } else {
            info.specificPresence = sourceFullJid;
            specific.insert(std::make_pair(sourceFullJid, info));
        }
        requested.erase(id);
        return valid;
    } else {
        return false;
    }
}