// 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/syslog/cpp/log_settings.h>
// CODELAB: Include inspect.

#include <lib/syslog/cpp/macros.h>

#include "reverser.h"

int main(int argc, char** argv) {
  // [START init_logger]
  fuchsia_logging::SetTags({"inspect_cpp_codelab", "part1"});
  // [END init_logger]

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

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

  // CODELAB: Initialize Inspect here.

  // Serve the reverser service.
  // [START serve_outgoing]
  context->outgoing()->AddPublicService(Reverser::CreateDefaultHandler());
  // [END serve_outgoing]

  // Send a request to the FizzBuzz service and print the response when it arrives.
  // [START fizzbuzz_connect]
  fuchsia::examples::inspect::FizzBuzzPtr fizz_buzz;
  context->svc()->Connect(fizz_buzz.NewRequest());
  fizz_buzz->Execute(30, [](std::string result) { FX_LOGS(INFO) << "Got FizzBuzz: " << result; });
  // [END fizzbuzz_connect]

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