#include <tee_internal_api.h>

#include <tlStd.h>
#include <TlApi/TlApi.h>
#include <TlApi/TlApiTime.h>
#include <protocol.h>
#include <tees_log.h>

extern PersObjectCmd *g_po_cmd_buffer;
extern ProtocolCmd *g_cmd_buffer;

static TEE_Result GetReeTime(TEE_Time *time) {
  TEE_Result status = TEE_ERROR_BAD_PARAMETERS;

  TEE_MemFill(g_po_cmd_buffer, 0x00, sizeof(PersObjectCmd));

  g_po_cmd_buffer->cmd_id = PROTOCOL_COMMAND_GETREETIME;
  g_po_cmd_buffer->data_len = sizeof(TEE_Time);

  /* Process request by client */
  tlApiNotify();
  /* Go on working */
  tlApiWaitNotification(TLAPI_INFINITE_TIMEOUT);

  status = g_cmd_buffer->cmd_ret;

  if (TEE_SUCCESS == status) {
    TEE_MemMove(time, g_po_cmd_buffer->data, sizeof(TEE_Time));
  }

  return status;
}

void TEE_GetREETime(TEE_Time *time) {
  if (!time) {
    return;
  }
  if (TEE_SUCCESS != GetReeTime(time)) {
    TEES_LOG(TEES_LOG_LEVEL_ERROR, "Panic reason: Get NWD Time error\n");
    TEE_Panic(0);
  }
}

// similar implementation for all platformes
TEE_Result TEE_Wait(uint32_t timeout) {
  timestamp_t current_msec = 0;
  timestamp_t start_msec = 0;

  if (!timeout) {
    return TEE_SUCCESS;
  }
  if (TLAPI_OK != tlApiGetSecureTimestamp(&start_msec)) {
    return TEE_ERROR_CANCEL;
  }
  do {
    if (TEE_GetCancellationFlag()) {
      return TEE_ERROR_CANCEL;
    }
    if (TLAPI_OK != tlApiGetSecureTimestamp(&current_msec)) {
      return TEE_ERROR_CANCEL;
    }
  } while (current_msec - start_msec < (timestamp_t)timeout * 1000);
  return TEE_SUCCESS;
}
