#include "Pledge.h"
#include "arch/Timer.h"
#include "memory/MemoryManager.h"
#include "sys/Syscall.h"
#include "thread/Scheduler.h"
#include <bits/clockid.h>
#include <bits/timespec.h>

Result<u64> sys_clock_gettime(Registers*, SyscallArgs args)
{
    clockid_t id = (clockid_t)args[0];
    struct timespec* ts = (struct timespec*)args[1];

    auto* current = Scheduler::current();

    TRY(check_pledge(current, Promise::p_stdio));

    switch (id)
    {
    case CLOCK_MONOTONIC: {
        if (!MemoryManager::copy_to_user_typed(ts, Timer::monotonic_clock())) return err(EFAULT);
        break;
    }
    case CLOCK_REALTIME: {
        if (!MemoryManager::copy_to_user_typed(ts, Timer::realtime_clock())) return err(EFAULT);
        break;
    }
    default: return err(EINVAL);
    }

    return 0;
}