#include "service_guard.h"
#include "services/ins.h"

static Service g_insrSrv;
static Service g_inssSrv;

NX_GENERATE_SERVICE_GUARD(insr);

Result _insrInitialize(void) {
    return smGetService(&g_insrSrv, "ins:r");
}

void _insrCleanup(void) {
    serviceClose(&g_insrSrv);
}

Service* insrGetServiceSession(void) {
    return &g_insrSrv;
}

Result insrGetLastTick(u32 id, u64 *tick) {
    return serviceDispatchInOut(&g_insrSrv, 0, id, *tick);
}

Result insrGetReadableEvent(u32 id, Event *out) {
    Handle tmp_handle;
    struct {
        u32 id;
        u64 unk;
    } in = { id, 0 };
    Result rc = serviceDispatchIn(&g_insrSrv, 1, in,
        .out_handle_attrs = { SfOutHandleAttr_HipcCopy },
        .out_handles = &tmp_handle,
    );

    if (R_SUCCEEDED(rc))
        eventLoadRemote(out, tmp_handle, false);

    return rc;
}

NX_GENERATE_SERVICE_GUARD(inss);

Result _inssInitialize(void) {
    return smGetService(&g_inssSrv, "ins:s");
}

void _inssCleanup(void) {
    serviceClose(&g_inssSrv);
}

Service* inssGetServiceSession(void) {
    return &g_inssSrv;
}

Result inssGetWritableEvent(u32 id, Event *out) {
    Handle tmp_handle;
    struct {
        u32 id;
        u64 unk;
    } in = { id, 0 };
    Result rc = serviceDispatchIn(&g_inssSrv, 0, in,
        .out_handle_attrs = { SfOutHandleAttr_HipcCopy },
        .out_handles = &tmp_handle,
    );

    if (R_SUCCEEDED(rc)) {
        *out = (Event){
            .revent    = INVALID_HANDLE,
            .wevent    = tmp_handle,
            .autoclear = false,
        };
    }

    return rc;
}