// 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/sys/cpp/component_context.h>
#include <lib/sys/inspect/cpp/component.h>
#include <zircon/status.h>

#include <src/lib/syslog/cpp/logger.h>

#include "reverser.h"

using syslog::InitLogger;

int main(int argc, char** argv) {
  InitLogger({"inspect_cpp_codelab", "part4"});

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

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

  // Create an inspector for this component.
  sys::ComponentInspector inspector(context.get());

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

  // Create a version string.
  // We pass the inspector along when creating the property to tie their lifecycles together.
  // It is an error to not retain the created property.
  inspector.root().CreateString("version", "part4", &inspector);

  // 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;
}
