#include <xs.h>
#include <xs/Scope.h>
using namespace xs;
using namespace panda;

static void xs_hints_set (pTHX_ CV*) {
    dVAR; dXSARGS;
    if (items != 2) croak("epta!");
    auto name = xs::in<string_view>(ST(0));
    auto val  = ST(1);
    Scope::Hints::set(name, val);
    XSRETURN(0);
}

static void xs_hints_exists (pTHX_ CV*) {
    dVAR; dXSARGS;
    if (items != 1) croak("epta!");
    auto name = xs::in<string_view>(ST(0));
    auto ret = Scope::Hints::exists(name);
    ST(0) = ret ? &PL_sv_yes : &PL_sv_no;
    XSRETURN(1);
}

static void xs_hints_get (pTHX_ CV*) {
    dVAR; dXSARGS;
    if (items != 1) croak("epta!");
    auto name = xs::in<string_view>(ST(0));
    auto ret = Scope::Hints::get(name);
    ST(0) = ret.detach_mortal();
    XSRETURN(1);
}

static void xs_hints_remove (pTHX_ CV*) {
    dVAR; dXSARGS;
    if (items != 1) croak("epta!");
    auto name = xs::in<string_view>(ST(0));
    Scope::Hints::remove(name);
    XSRETURN(0);
}

static void xs_hints_get_hash (pTHX_ CV*) {
    dVAR; dXSARGS;
    if (items != 0) croak("epta!");
    auto ret = Scope::Hints::get();
    EXTEND(SP, 1);
    ST(0) = Ref::create(ret).detach_mortal();
    XSRETURN(1);
}

static void xs_hints_get_ct (pTHX_ CV*) {
    dVAR; dXSARGS;
    if (items != 1) croak("epta!");
    auto name = xs::in<string_view>(ST(0));
    auto ret = Scope::Hints::get_ct(name);
    ST(0) = ret.detach_mortal();
    XSRETURN(1);
}

static bool init () {
    auto file = "scope.cc";
    newXS("MyTest::Hints::set", &xs_hints_set, file);
    newXS("MyTest::Hints::exists", &xs_hints_exists, file);
    newXS("MyTest::Hints::get", &xs_hints_get, file);
    newXS("MyTest::Hints::remove", &xs_hints_remove, file);
    newXS("MyTest::Hints::get_hash", &xs_hints_get_hash, file);
    newXS("MyTest::Hints::get_ct", &xs_hints_get_ct, file);
    return true;
}

static bool _init = init();