#include <3ds.h>

#include "task.h"
#include "../error.h"

static bool task_quit;

static Handle task_pause_event;
static Handle task_suspend_event;

static aptHookCookie cookie;

static void task_apt_hook(APT_HookType hook, void* param) {
    switch(hook) {
        case APTHOOK_ONRESTORE:
            svcSignalEvent(task_suspend_event);
        case APTHOOK_ONWAKEUP:
            svcSignalEvent(task_pause_event);
            break;
        case APTHOOK_ONSUSPEND:
            svcClearEvent(task_suspend_event);
        case APTHOOK_ONSLEEP:
            svcClearEvent(task_pause_event);
            break;
        default:
            break;
    }
}

void task_init() {
    task_quit = false;

    Result res = 0;

    if(R_FAILED(res = svcCreateEvent(&task_pause_event, RESET_STICKY))) {
        error_panic("无法创建任务暂停事件: 0x%08lX", res);
        return;
    }

    if(R_FAILED(res = svcCreateEvent(&task_suspend_event, RESET_STICKY))) {
        svcCloseHandle(task_pause_event);

        error_panic("无法创建任务挂起事件: 0x%08lX", res);
        return;
    }

    svcSignalEvent(task_pause_event);
    svcSignalEvent(task_suspend_event);

    aptHook(&cookie, task_apt_hook, NULL);
}

void task_exit() {
    task_quit = true;

    aptUnhook(&cookie);

    if(task_pause_event != 0) {
        svcCloseHandle(task_pause_event);
        task_pause_event = 0;
    }

    if(task_suspend_event != 0) {
        svcCloseHandle(task_suspend_event);
        task_suspend_event = 0;
    }
}

bool task_is_quit_all() {
    return task_quit;
}

Handle task_get_pause_event() {
    return task_pause_event;
}

Handle task_get_suspend_event() {
    return task_suspend_event;
}