#include "include/private/dvr/performance_client.h"

#include <sys/types.h>

#include <pdx/default_transport/client_channel_factory.h>
#include <pdx/rpc/remote_method.h>
#include <pdx/rpc/string_wrapper.h>
#include <private/dvr/performance_rpc.h>

using android::pdx::rpc::WrapString;

namespace android {
namespace dvr {

PerformanceClient::PerformanceClient(int* error)
    : BASE(pdx::default_transport::ClientChannelFactory::Create(
          PerformanceRPC::kClientPath)) {
  if (error)
    *error = Client::error();
}

int PerformanceClient::SetCpuPartition(pid_t task_id,
                                       const std::string& partition) {
  if (task_id == 0)
    task_id = gettid();

  return ReturnStatusOrError(
      InvokeRemoteMethod<PerformanceRPC::SetCpuPartition>(task_id, partition));
}

int PerformanceClient::SetCpuPartition(pid_t task_id, const char* partition) {
  if (task_id == 0)
    task_id = gettid();

  return ReturnStatusOrError(
      InvokeRemoteMethod<PerformanceRPC::SetCpuPartition>(
          task_id, WrapString(partition)));
}

int PerformanceClient::SetSchedulerClass(pid_t task_id,
                                         const std::string& scheduler_class) {
  if (task_id == 0)
    task_id = gettid();

  return ReturnStatusOrError(
      InvokeRemoteMethod<PerformanceRPC::SetSchedulerClass>(task_id,
                                                            scheduler_class));
}

int PerformanceClient::SetSchedulerClass(pid_t task_id,
                                         const char* scheduler_class) {
  if (task_id == 0)
    task_id = gettid();

  return ReturnStatusOrError(
      InvokeRemoteMethod<PerformanceRPC::SetSchedulerClass>(
          task_id, WrapString(scheduler_class)));
}

int PerformanceClient::GetCpuPartition(pid_t task_id,
                                       std::string* partition_out) {
  if (partition_out == nullptr)
    return -EINVAL;

  if (task_id == 0)
    task_id = gettid();

  auto status = InvokeRemoteMethodInPlace<PerformanceRPC::GetCpuPartition>(
      partition_out, task_id);
  return status ? 0 : -status.error();
}

int PerformanceClient::GetCpuPartition(pid_t task_id, char* partition_out,
                                       std::size_t size) {
  if (partition_out == nullptr)
    return -EINVAL;

  if (task_id == 0)
    task_id = gettid();

  auto wrapper = WrapString(partition_out, size);
  auto status = InvokeRemoteMethodInPlace<PerformanceRPC::GetCpuPartition>(
      &wrapper, task_id);
  if (!status)
    return -status.error();

  if (wrapper.size() < size)
    partition_out[wrapper.size()] = '\0';

  return 0;
}

}  // namespace dvr
}  // namespace android

extern "C" int dvrSetCpuPartition(pid_t task_id, const char* partition) {
  int error;
  if (auto client = android::dvr::PerformanceClient::Create(&error))
    return client->SetCpuPartition(task_id, partition);
  else
    return error;
}

extern "C" int dvrSetSchedulerClass(pid_t task_id,
                                    const char* scheduler_class) {
  int error;
  if (auto client = android::dvr::PerformanceClient::Create(&error))
    return client->SetSchedulerClass(task_id, scheduler_class);
  else
    return error;
}

extern "C" int dvrGetCpuPartition(pid_t task_id, char* partition, size_t size) {
  int error;
  if (auto client = android::dvr::PerformanceClient::Create(&error))
    return client->GetCpuPartition(task_id, partition, size);
  else
    return error;
}
