// 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 <lib/async-loop/cpp/loop.h>
#include <lib/async-loop/default.h>
#include <lib/inspect/component/cpp/component.h>
#include <lib/sys/cpp/component_context.h>
#include <lib/syslog/cpp/log_settings.h>
#include <lib/syslog/cpp/macros.h>
#include <zircon/status.h>

#include "reverser.h"

int main(int argc, char** argv) {
  fuchsia_logging::LogSettingsBuilder builder;
  builder.WithTags({"inspect_cpp_codelab", "part3"}).BuildAndInitialize();

  FX_LOGS(INFO) << "Starting up...";

  // Standard component setup, create an event loop and obtain the
  // ComponentContext.
  async::Loop loop(&kAsyncLoopConfigAttachToCurrentThread);
  auto context = sys::ComponentContext::CreateAndServeOutgoingDirectory();

  // Create an inspector for this component.
  inspect::ComponentInspector inspector(loop.dispatcher(), {});

  // ComponentInspector has built-in health checking. Set it to "starting up" so snapshots show we
  // may still be initializing.
  inspector.Health().StartingUp();

  // Record a version string.
  // We use the RecordString method when creating the property to tie lifecycles together.
  // It is an error to not retain the property if we had used CreateString.
  inspector.root().RecordString("version", "part3");

  // Serve the reverser service.
  context->outgoing()->AddPublicService(
      Reverser::CreateDefaultHandler(inspector.root().CreateChild("reverser_service")));

  // Send a request to the FizzBuzz service and print the response when it arrives.
  fuchsia::examples::inspect::FizzBuzzPtr fizz_buzz;
  context->svc()->Connect(fizz_buzz.NewRequest());

  // Create an error handler for the FizzBuzz service.
  fizz_buzz.set_error_handler([&](zx_status_t status) {
    char message[256];
    snprintf(message, 256, "FizzBuzz connection closed: %s", zx_status_get_string(status));
    inspector.Health().Unhealthy(message);
  });

  fizz_buzz->Execute(30, [&](std::string result) {
    // Once we get FizzBuzz response, set health to OK.
    inspector.Health().Ok();
    FX_LOGS(INFO) << "Got FizzBuzz: " << result;
  });

  // Run the loop.
  loop.Run();
  return 0;
}
