#include "quikcoast.h"
#include "quikqtbridge.h"
#include <QDebug>

QuikQtBridge *QuikQtBridge::global_bridge = nullptr;

QuikQtBridge *QuikQtBridge::initQuikQtBridge()
{
    if(!global_bridge)
        global_bridge = new QuikQtBridge();
    return global_bridge;
}

void QuikQtBridge::deinitQuikQtBridge()
{
    if(global_bridge)
    {
        QuikQtBridge *toDel = global_bridge;
        delete toDel;
    }
}

void QuikQtBridge::invokeMethod(QString method, const QVariantList &args, QVariantList &res, QuikCallbackHandler *errOut)
{
    QString errMsg;
    if(!invokeQuik(method, args, res, errMsg))
        errOut->sendStderrLine(errMsg);
}

void QuikQtBridge::invokeObjectMethod(int objid, QString method, const QVariantList &args, QVariantList &res, QuikCallbackHandler *errOut)
{
    QString errMsg;
    if(!invokeQuikObject(objid, method, args, res, errMsg))
        errOut->sendStderrLine(errMsg);
}

void QuikQtBridge::deleteObject(int objid)
{
    deleteQuikObject(objid);
}

bool QuikQtBridge::registerCallback(QuikCallbackHandler *handler, QString name)
{
    if(m_handlers.contains(name))
        return false;
    if(name!="OnStop" && name!="OnParam" && name!="OnQuote")
    {
        if(!registerNamedCallback(name))
            return false;
    }
    m_handlers.insert(name, handler);
    return true;
}

void QuikQtBridge::getVariable(QString varname, QVariant &res)
{
    getQuikVariable(varname, res);
}

lua_State *QuikQtBridge::getRecentStackForThreadId(Qt::HANDLE ctid)
{
    if(recentStackMap.contains(ctid))
        return recentStackMap.value(ctid);
    return nullptr;
}

void QuikQtBridge::setRecentStack(Qt::HANDLE ctid, lua_State *l)
{
    recentStackMap.insert(ctid, l);
}

void QuikQtBridge::callbackRequest(QString name, const QVariantList &args, QVariant &vres)
{
#ifdef QT_DEBUG
    qDebug() << "callbackRequest:" << name;
#endif
    if(m_handlers.contains(name))
    {
        m_handlers.value(name)->callbackRequest(name, args, vres);
    }
}

QuikQtBridge::QuikQtBridge()
    : QObject()
{

}

QuikQtBridge::~QuikQtBridge()
{
    unregisterAllNamedCallbacks();
}