#include "base_command.h"

#include <string>

#if defined(QSEE)
const TEEC_UUID BaseCommandTest::kClientTaUuid = {0x70615f66, 0x7465, 0x7374, {
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
#elif defined(TBASE)
const TEEC_UUID BaseCommandTest::kClientTaUuid = {0xffffffff, 0x0000, 0x0000, {
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79}};
#elif defined(TEEGRIS)
const TEEC_UUID BaseCommandTest::kClientTaUuid = {0x00000000, 0x0000, 0x0000, {
    0x00, 0x00, 0x54, 0x50, 0x52, 0x4f, 0x43, 0x41}};
#endif

void BaseCommandTest::LoadApp() {
  memset(&handler, 0, sizeof(handler));
  memset(&context, 0, sizeof(context));
  memset(&session, 0, sizeof(session));

  PaResult result = PaHandlerCreate(&handler);
  ASSERT_TRUE(result == PA_SUCCESS);

  TEEC_Result status = TEEC_InitializeContext(NULL, &context);
  ASSERT_TRUE(status == TEEC_SUCCESS);

  uint32_t return_origin;
  status = TEEC_OpenSession(&context, &session, &kClientTaUuid, 0, NULL,
                            NULL, &return_origin);
  ASSERT_TRUE(status == TEEC_SUCCESS);
}

void BaseCommandTest::UnloadApp() {
  PaHandlerDestroy (&handler);

  TEEC_CloseSession(&session);
  TEEC_FinalizeContext(&context);
}

TEEC_Result BaseCommandTest::SendCommand(TciCommand& command) {
  TEEC_Operation operation;
  uint32_t return_origin;
  operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, TEEC_NONE,
                                          TEEC_NONE, TEEC_NONE);
  operation.params[0].tmpref.buffer = &command;
  operation.params[0].tmpref.size = sizeof(command);

  TEEC_Result status = TEEC_InvokeCommand(&session, command.cmdId,
                                          &operation, &return_origin);

  return status;
}

uint8_t AccessNwdTask::big_buffer[kSizeBigBuffer];
void *AccessNwdTask::mprotected_buffers[kFlagsEnd];

uint64_t AccessNwdTask::SimpleChecksum(const uint8_t *buffer, size_t size) {
  uint64_t sum = 0;

  for (size_t i = 0; i < size; ++i) {
    sum += buffer[i];
  }

  return sum;
}
