#include "ProcCommand.h"

#include "TigerTci.h"
#include "TigerLogging.h"
#include "tzWrappers/TzwRpmb.h"

#include "TigerCounterDataStore.h"
#include "TigerSskds.h"
#include "TzwSerialNumber.h"

TEE_Result procCommand(const void* request, const uint32_t sizeRequest,
                      void* response, uint32_t *sizeResponse) {
    LOG_FUNC_BEGIN
    LOG_I_AM_HERE

    TCI_TEST_COMMAND_ID cmdId  = read32(request);
    lv_p data = (lv_p)(request + sizeof(uint32_t));
    TEE_Result result = TEE_SUCCESS;
    uint32_t size = 0;
    uint8_t *testResponse = (uint8_t*)response + sizeof(uint32_t);

    switch(cmdId){
        case TCI_TEST_RPMB_WRITE:
                result = testRpmbWrite(data->value, data->len, testResponse, &size);
            break;

        case TCI_TEST_RPMB_READ:
                result = testRpmbRead(data->value, data->len, testResponse, &size);
            break;

        case TCI_TEST_RPMB_CLEAR:
                result = testRpmbClear(data->value, data->len, testResponse, &size);
            break;

        case TCI_TEST_STORAGE_CREATE_NEW_FILE:
                result = testCreateNewFile(data->value, data->len, testResponse, &size);
            break;

        case TCI_TEST_STORAGE_CREATE_OPEN_FILE:
                result = testCreateAndOpenFile(data->value, data->len, testResponse, &size);
            break;

        case TCI_TEST_STORAGE_OPEN_READ_FILE:
                result = testOpenReadFile(data->value, data->len, testResponse, &size);
            break;

        case TCI_TEST_PERSISTENT_OBJECT_READ:
            result = CALL_TESTBED_FUNC(persistentObjectRead);
            break;
        case TCI_TEST_PERSISTENT_OBJECT_WRITE:
            result = CALL_TESTBED_FUNC(persistentObjectWrite);
            break;

        case TCI_TEST_PERSISTENT_OBJECT_WRITE_AND_READ:
            result = CALL_TESTBED_FUNC(persistentObjectWriteAndRead);
            break;

        case TCI_TEST_SSKDS_STORE_DEVICE_ID:
                result = CALL_TESTBED_FUNC(storeDeviceId);
            break;

        case TCI_TEST_DATASTORE_SET_COUNTER:
                result = CALL_TESTBED_FUNC(tigerSetCounter);
            break;
        case TCI_TEST_DATASTORE_GET_COUNTER:
                result = CALL_TESTBED_FUNC(tigerGetCounter);
            break;

        case TCI_TEST_DATASTORE_INC_COUNTER:
                result = CALL_TESTBED_FUNC(tigerIncCounter);
            break;

        case TCI_TEST_DATASTORE_GET_INC_COUNTER:
                result = CALL_TESTBED_FUNC(tigerGetIncCounter);
            break;

        case TCI_TEST_READ_SERIAL_NUMBER:
                result = CALL_TESTBED_FUNC(tzwReadSerialNumber);
            break;

        default:
            LOG_E("Command ID(0x%08x) not support yet", cmdId);
            break;
    }

    write32(response, result);
    *sizeResponse = size + sizeof(uint32_t);

    LOG_FUNC_END

    return TEE_SUCCESS;
}

