/*
 * Copyright 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <nos/NuggetClientDebuggable.h>
#include <limits>
#include <nos/transport.h>
#include <application.h>

namespace nos {

NuggetClientDebuggable::NuggetClientDebuggable(
  const char* name, uint32_t config,
  request_cb_t req_fn, response_cb_t resp_fn)
  : NuggetClient(name, config),
    request_cb_(req_fn), response_cb_(resp_fn) {}

uint32_t NuggetClientDebuggable::CallApp(uint32_t appId, uint16_t arg,
                                         const std::vector<uint8_t>& request,
                                         std::vector<uint8_t>* response) {
  if (!open_) {
    return APP_ERROR_IO;
  }

  if (request.size() > std::numeric_limits<uint32_t>::max()) {
    return APP_ERROR_TOO_MUCH;
  }

  const uint32_t requestSize = request.size();
  uint32_t replySize = 0;
  uint8_t* replyData = nullptr;

  if (response != nullptr) {
    response->resize(response->capacity());
    replySize = response->size();
    replyData = response->data();
  }

  if (request_cb_) {
    (request_cb_)(request);
  }

  uint32_t status_code = nos_call_application(&device_, appId, arg,
                                              request.data(), requestSize,
                                              replyData, &replySize);

  if (response != nullptr) {
    response->resize(replySize);
    if (response_cb_) {
      (response_cb_)(status_code, *response);
    }
  }

  return status_code;
}

}  // namespace nos
