// Copyright 2023 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "starboard/shared/modular/starboard_layer_posix_time_abi_wrappers.h"

#include "starboard/log.h"

int __abi_wrap_clock_gettime(int /* clockid_t */ musl_clock_id,
                             struct musl_timespec* mts) {
  if (!mts) {
    return -1;
  }
  clockid_t clock_id;  // The type from platform toolchain.
  // Map the MUSL clock_id constants to platform constants.
  switch (musl_clock_id) {
    case MUSL_CLOCK_REALTIME:
      clock_id = CLOCK_REALTIME;
      break;
    case MUSL_CLOCK_MONOTONIC:
      clock_id = CLOCK_MONOTONIC;
      break;
    case MUSL_CLOCK_PROCESS_CPUTIME_ID:
      clock_id = CLOCK_PROCESS_CPUTIME_ID;
      break;
    case MUSL_CLOCK_THREAD_CPUTIME_ID:
      clock_id = CLOCK_THREAD_CPUTIME_ID;
      break;
    default:
      clock_id = CLOCK_REALTIME;
      SbLog(kSbLogPriorityError,
            "Unsuppored clock_id used in clock_gettime() - defaulting to "
            "CLOCK_REALTIME.");
  }
  struct timespec ts;  // The type from platform toolchain.
  int retval = clock_gettime(clock_id, &ts);
  mts->tv_sec = ts.tv_sec;
  mts->tv_nsec = ts.tv_nsec;
  return retval;
}

int __abi_wrap_gettimeofday(struct musl_timeval* mtv, void* tzp) {
  if (!mtv) {
    return -1;
  }
  struct timeval tv;  // The type from platform toolchain.
  int retval = gettimeofday(&tv, NULL);
  mtv->tv_sec = tv.tv_sec;
  mtv->tv_usec = tv.tv_usec;
  return retval;
}

int64_t __abi_wrap_time(int64_t* /* time_t* */ musl_tloc) {
  time_t t = time(NULL);  // The type from platform toolchain (may be 32-bits).
  int64_t retval = static_cast<int64_t>(t);
  if (musl_tloc) {
    *musl_tloc = retval;
  }
  return retval;
}

struct musl_tm* __abi_wrap_gmtime_r(const int64_t* /* time_t* */ musl_timer,
                                    struct musl_tm* musl_result) {
  if (!musl_timer || !musl_result) {
    return NULL;
  }
  time_t t = static_cast<time_t>(*musl_timer);  // Platform type may be 32-bits.
  struct tm tm;  // The type from platform toolchain.
  if (!gmtime_r(&t, &tm)) {
    return NULL;
  }
  musl_result->tm_sec = tm.tm_sec;
  musl_result->tm_min = tm.tm_min;
  musl_result->tm_hour = tm.tm_hour;
  musl_result->tm_mday = tm.tm_mday;
  musl_result->tm_mon = tm.tm_mon;
  musl_result->tm_year = tm.tm_year;
  musl_result->tm_wday = tm.tm_wday;
  musl_result->tm_yday = tm.tm_yday;
  musl_result->tm_isdst = tm.tm_isdst;
  return musl_result;
}
