// Copyright 2016 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/macros.h>
#include <lib/trace-provider/provider.h>

#include "src/lib/fxl/command_line.h"
#include "src/lib/fxl/log_settings_command_line.h"
#include "src/ui/tools/present_view/present_view.h"

namespace {

constexpr char kKeyLocale[] = "locale";

present_view::ViewInfo ParseCommandLine(const fxl::CommandLine& command_line) {
  present_view::ViewInfo view_info;

  const auto& positional_args = command_line.positional_args();
  if (positional_args.empty()) {
    return {};
  }

  view_info.url = positional_args[0];
  for (size_t i = 1; i < positional_args.size(); ++i) {
    view_info.arguments.push_back(positional_args[i]);
  }
  if (command_line.HasOption(kKeyLocale)) {
    command_line.GetOptionValue(kKeyLocale, &view_info.locale);
  }

  return view_info;
}

}  // namespace

int main(int argc, const char** argv) {
  async::Loop loop(&kAsyncLoopConfigAttachToCurrentThread);
  trace::TraceProviderWithFdio trace_provider(loop.dispatcher());

  auto command_line = fxl::CommandLineFromArgcArgv(argc, argv);
  if (!fxl::SetLogSettingsFromCommandLine(command_line)) {
    return 1;
  }

  FX_LOGS(WARNING) << "BE ADVISED: The present_view tool takes the URL to an "
                      "app that provided the ViewProvider interface and makes "
                      "its view the root view.";
  FX_LOGS(WARNING) << "This tool is intended for testing and debugging purposes "
                      "only and may cause problems if invoked incorrectly.";
  FX_LOGS(WARNING) << "Do not invoke present_view if a view tree already exists "
                      "(i.e. if any process that creates a view is already "
                      "running).";
  FX_LOGS(WARNING) << "If scenic is already running on your system you "
                      "will probably want to kill it before invoking this tool.";

  present_view::ViewInfo view_info = ParseCommandLine(command_line);
  present_view::PresentView present_view(sys::ComponentContext::CreateAndServeOutgoingDirectory());

  int retval = 0;
  bool present_success =
      present_view.Present(std::move(view_info), [&loop, &retval](zx_status_t status) {
        FX_LOGS(INFO) << "Launched component terminated; status: " << status;
        retval = 1;
        loop.Quit();
      });
  if (!present_success) {
    return 1;
  }

  loop.Run();

  return retval;
}
