// Copyright 2020 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/fuchsia.examples/cpp/wire.h>
#include <lib/component/incoming/cpp/protocol.h>
#include <lib/syslog/cpp/macros.h>

// ============================================================================
// This is an accompanying example code for the C++ client tutorial. Head over
// there for the full walk-through:
// https://fuchsia.dev/fuchsia-src/development/languages/fidl/tutorials/cpp/basics/sync-client
// ============================================================================

int main(int argc, const char** argv) {
  // Connect to the |fuchsia.examples/Echo| protocol inside the component's
  // namespace. This can fail so it's wrapped in a |zx::result| and it must be
  // checked for errors.
  zx::result client_end = component::Connect<fuchsia_examples::Echo>();
  if (!client_end.is_ok()) {
    FX_LOGS(ERROR) << "Synchronous error when connecting to the |Echo| protocol: "
                   << client_end.status_string();
    return -1;
  }

  // [START init-client]
  fidl::WireSyncClient client(std::move(*client_end));
  // [END init-client]

  {
    // Make an EchoString call.
    fidl::WireResult result = client->EchoString("hello");
    // Check if the FIDL call succeeded or not.
    if (!result.ok()) {
      // If the call failed, log the error, and quit the program.
      // Production code should do more graceful error handling depending
      // on the situation.
      FX_LOGS(ERROR) << "EchoString failed: " << result.error();
      return -1;
    }
    FX_LOGS(INFO) << "Got response: " << result->response.get();
  }

  {
    // Make a SendString call.
    fidl::Status result = client->SendString("hi");
    if (!result.ok()) {
      FX_LOGS(ERROR) << "SendString failed: " << result.error();
      return -1;
    }

    // [START event-handler]
    // Define the event handler implementation for the client.
    //
    // The event handler should be an object that implements
    // |fidl::WireSyncEventHandler<Echo>|, and override all pure virtual methods
    // in that class corresponding to the events offered by the protocol.
    class EventHandler : public fidl::WireSyncEventHandler<fuchsia_examples::Echo> {
     public:
      EventHandler() = default;

      void OnString(fidl::WireEvent<fuchsia_examples::Echo::OnString>* event) override {
        FX_LOGS(INFO) << "Got event: " << event->response.get();
      }
    };
    // [END event-handler]

    // [START handle-one-event]
    // Block to receive exactly one event from the server, which is handled using
    // the event handlers defined above.
    EventHandler event_handler;
    fidl::Status status = client.HandleOneEvent(event_handler);
    if (!status.ok()) {
      FX_LOGS(ERROR) << "HandleOneEvent failed: " << status.error();
      return -1;
    }
    // [END handle-one-event]
  }

  return 0;
}
