// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

// GameKit
#include <aws/gamekit/core/feature_resources.h>
#include <aws/gamekit/core/awsclients/default_clients.h>
#include <aws/gamekit/user-gameplay-data/exports.h>
#include <aws/gamekit/user-gameplay-data/gamekit_user_gameplay_data.h>

using namespace GameKit::Logger;
using namespace GameKit::UserGameplayData;

GAMEKIT_USER_GAMEPLAY_DATA_INSTANCE_HANDLE GameKitUserGameplayDataInstanceCreateWithSessionManager(void* sessionManager, FuncLogCallback logCb)
{
    Logging::Log(logCb, Level::Info, "UserGameplayData Instance Create with default settings.");
    GameKit::Authentication::GameKitSessionManager* sessMgr = (GameKit::Authentication::GameKitSessionManager*)sessionManager;
    UserGameplayData* gameplayData = new UserGameplayData(sessMgr, logCb);

    return (GameKit::GameKitFeature*)gameplayData;
}

void GameKitSetUserGameplayDataClientSettings(GAMEKIT_USER_GAMEPLAY_DATA_INSTANCE_HANDLE userGameplayDataInstance, GameKit::UserGameplayDataClientSettings settings)
{
    ((UserGameplayData*)((GameKit::GameKitFeature*)userGameplayDataInstance))->SetClientSettings(settings);
}

//Create
unsigned int GameKitAddUserGameplayData(GAMEKIT_USER_GAMEPLAY_DATA_INSTANCE_HANDLE userGameplayDataInstance, GameKit::UserGameplayDataBundle userGameplayDataBundle, DISPATCH_RECEIVER_HANDLE unprocessedItemsReceiver, FuncBundleResponseCallback unprocessedItemsCallback)
{
    return ((UserGameplayData*)((GameKit::GameKitFeature*)userGameplayDataInstance))->AddUserGameplayData(userGameplayDataBundle, unprocessedItemsReceiver, unprocessedItemsCallback);
}

//Read
unsigned int GameKitListUserGameplayDataBundles(GAMEKIT_USER_GAMEPLAY_DATA_INSTANCE_HANDLE userGameplayDataInstance, DISPATCH_RECEIVER_HANDLE receiver, FuncListGameplayDataBundlesResponseCallback responseCallback)
{
    return ((UserGameplayData*)((GameKit::GameKitFeature*)userGameplayDataInstance))->ListUserGameplayDataBundles(receiver, responseCallback);
}

unsigned int GameKitGetUserGameplayDataBundle(GAMEKIT_USER_GAMEPLAY_DATA_INSTANCE_HANDLE userGameplayDataInstance, char* bundleName, DISPATCH_RECEIVER_HANDLE receiver, FuncBundleResponseCallback responseCallback)
{
    return ((UserGameplayData*)((GameKit::GameKitFeature*)userGameplayDataInstance))->GetUserGameplayDataBundle(bundleName, receiver, responseCallback);
}

unsigned int GameKitGetUserGameplayDataBundleItem(GAMEKIT_USER_GAMEPLAY_DATA_INSTANCE_HANDLE userGameplayDataInstance, GameKit::UserGameplayDataBundleItem userGameplayDataBundleItem, DISPATCH_RECEIVER_HANDLE receiver, FuncBundleItemResponseCallback responseCallback)
{
    return ((UserGameplayData*)((GameKit::GameKitFeature*)userGameplayDataInstance))->GetUserGameplayDataBundleItem(userGameplayDataBundleItem, receiver, responseCallback);
}

//Update
unsigned int GameKitUpdateUserGameplayDataBundleItem(GAMEKIT_USER_GAMEPLAY_DATA_INSTANCE_HANDLE userGameplayDataInstance, GameKit::UserGameplayDataBundleItemValue userGameplayDataBundleItemValue)
{
    return ((UserGameplayData*)((GameKit::GameKitFeature*)userGameplayDataInstance))->UpdateUserGameplayDataBundleItem(userGameplayDataBundleItemValue);
}

//Destroy
unsigned int GameKitDeleteAllUserGameplayData(GAMEKIT_USER_GAMEPLAY_DATA_INSTANCE_HANDLE userGameplayDataInstance)
{
    return ((UserGameplayData*)((GameKit::GameKitFeature*)userGameplayDataInstance))->DeleteAllUserGameplayData();
}

unsigned int GameKitDeleteUserGameplayDataBundle(GAMEKIT_USER_GAMEPLAY_DATA_INSTANCE_HANDLE userGameplayDataInstance, char* bundleName)
{
    return ((UserGameplayData*)((GameKit::GameKitFeature*)userGameplayDataInstance))->DeleteUserGameplayDataBundle(bundleName);
}

unsigned int GameKitDeleteUserGameplayDataBundleItems(GAMEKIT_USER_GAMEPLAY_DATA_INSTANCE_HANDLE userGameplayDataInstance, GameKit::UserGameplayDataDeleteItemsRequest deleteItemsRequest)
{
    return ((UserGameplayData*)((GameKit::GameKitFeature*)userGameplayDataInstance))->DeleteUserGameplayDataBundleItems(deleteItemsRequest);
}

void GameKitUserGameplayDataInstanceRelease(GAMEKIT_USER_GAMEPLAY_DATA_INSTANCE_HANDLE userGameplayDataInstance)
{
    delete((UserGameplayData*)((GameKit::GameKitFeature*)userGameplayDataInstance));
}

void GameKitUserGameplayDataStartRetryBackgroundThread(GAMEKIT_USER_GAMEPLAY_DATA_INSTANCE_HANDLE userGameplayDataInstance)
{
    ((UserGameplayData*)((GameKit::GameKitFeature*)userGameplayDataInstance))->StartRetryBackgroundThread();
}

void GameKitUserGameplayDataStopRetryBackgroundThread(GAMEKIT_USER_GAMEPLAY_DATA_INSTANCE_HANDLE userGameplayDataInstance)
{
    ((UserGameplayData*)((GameKit::GameKitFeature*)userGameplayDataInstance))->StopRetryBackgroundThread();
}

void GameKitUserGameplayDataSetNetworkChangeCallback(GAMEKIT_USER_GAMEPLAY_DATA_INSTANCE_HANDLE userGameplayDataInstance, NETWORK_STATE_RECEIVER_HANDLE receiverHandle, NetworkStatusChangeCallback statusChangeCallback)
{
    ((UserGameplayData*)((GameKit::GameKitFeature*)userGameplayDataInstance))->SetNetworkChangeCallback(receiverHandle, statusChangeCallback);
}

void GameKitUserGameplayDataSetCacheProcessedCallback(GAMEKIT_USER_GAMEPLAY_DATA_INSTANCE_HANDLE userGameplayDataInstance, CACHE_PROCESSED_RECEIVER_HANDLE receiverHandle, CacheProcessedCallback cacheProcessedCallback)
{
    ((UserGameplayData*)((GameKit::GameKitFeature*)userGameplayDataInstance))->SetCacheProcessedCallback(receiverHandle, cacheProcessedCallback);
}

void GameKitUserGameplayDataDropAllCachedEvents(GAMEKIT_USER_GAMEPLAY_DATA_INSTANCE_HANDLE userGameplayDataInstance)
{
    ((UserGameplayData*)((GameKit::GameKitFeature*)userGameplayDataInstance))->DropAllCachedEvents();
}

unsigned int GameKitUserGameplayDataPersistApiCallsToCache(GAMEKIT_USER_GAMEPLAY_DATA_INSTANCE_HANDLE userGameplayDataInstance, const char* offlineCacheFile)
{
    return ((UserGameplayData*)((GameKit::GameKitFeature*)userGameplayDataInstance))->PersistApiCallsToCache(offlineCacheFile);
}

unsigned int GameKitUserGameplayDataLoadApiCallsFromCache(GAMEKIT_USER_GAMEPLAY_DATA_INSTANCE_HANDLE userGameplayDataInstance, const char* offlineCacheFile)
{
    return ((UserGameplayData*)((GameKit::GameKitFeature*)userGameplayDataInstance))->LoadApiCallsFromCache(offlineCacheFile);
}