// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <fidl/examples/echo/llcpp/fidl.h>
#include <fuchsia/sys/cpp/fidl.h>
#include <lib/async-loop/cpp/loop.h>
#include <lib/async/default.h>
#include <lib/sys/cpp/component_context.h>
#include <lib/zx/channel.h>
#include <lib/zx/process.h>
#include <zircon/processargs.h>
#include <zircon/status.h>

#include <iostream>
#include <string>
#include <vector>

int main(int argc, const char** argv) {
  std::string server_url =
      "fuchsia-pkg://fuchsia.com/echo_server_llcpp#meta/echo_server_llcpp.cmx";
  std::string msg = "hello world";

  for (int i = 1; i < argc - 1; ++i) {
    if (!strcmp("--server", argv[i])) {
      server_url = argv[++i];
    } else if (!strcmp("-m", argv[i])) {
      msg = argv[++i];
    }
  }

  // Using high-level C++ bindings to launch the server component
  async::Loop loop(&kAsyncLoopConfigAttachToThread);
  fidl::InterfaceHandle<fuchsia::io::Directory> directory;
  fuchsia::sys::LaunchInfo launch_info;
  launch_info.url = server_url;
  launch_info.directory_request = directory.NewRequest().TakeChannel();
  fuchsia::sys::LauncherPtr launcher;
  auto context = sys::ComponentContext::Create();
  context->svc()->Connect(launcher.NewRequest());
  fuchsia::sys::ComponentControllerPtr controller;
  launcher->CreateComponent(std::move(launch_info), controller.NewRequest());

  sys::ServiceDirectory echo_provider(std::move(directory));
  zx::channel server_end, client_end;
  assert(zx::channel::create(0, &client_end, &server_end) == ZX_OK);
  echo_provider.Connect("fidl.examples.echo.Echo", std::move(server_end));

  // Using low-level C++ bindings to perform a call
  fidl::examples::echo::Echo::SyncClient client(std::move(client_end));
  std::vector<uint8_t> request_buffer(512);
  std::vector<uint8_t> response_buffer(512);
  fidl::StringView out_str = {};
  zx_status_t status = client.EchoString(
      fidl::BytePart(&request_buffer[0], request_buffer.size()),
      fidl::StringView(msg.size(), &msg[0]),
      fidl::BytePart(&response_buffer[0], response_buffer.size()), &out_str);
  if (status != ZX_OK) {
    std::cerr << "Failed to call server: " << status << " ("
              << zx_status_get_string(status) << ")" << std::endl;
    return status;
  }

  std::string reply_string(out_str.data(), out_str.size());
  std::cout << "Reply: " << reply_string << std::endl;

  return 0;
}
