// Copyright 2018 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/zx/channel.h>

#include <fuchsia/ui/policy/cpp/fidl.h>
#include <fuchsia/ui/viewsv1/cpp/fidl.h>
#include "garnet/bin/ui/root_presenter/renderer_params.h"
#include "lib/component/cpp/startup_context.h"
#include "lib/fxl/command_line.h"
#include "lib/fxl/log_settings_command_line.h"
#include "lib/fxl/logging.h"
#include "lib/svc/cpp/services.h"

int main(int argc, const char** argv) {
  auto command_line = fxl::CommandLineFromArgcArgv(argc, argv);
  if (!fxl::SetLogSettingsFromCommandLine(command_line))
    return 1;

  FXL_LOG(WARNING)
      << "This tool is intended for testing and debugging purposes "
         "only and may cause problems if invoked incorrectly.";

  root_presenter::RendererParams presenter_renderer_params =
      root_presenter::RendererParams::FromCommandLine(command_line);

  bool clipping_enabled = true;
  if (presenter_renderer_params.clipping_enabled.has_value()) {
    clipping_enabled = presenter_renderer_params.clipping_enabled.value();
  }

  std::vector<fuchsia::ui::gfx::RendererParam> renderer_params;
  if (presenter_renderer_params.render_frequency.has_value()) {
    fuchsia::ui::gfx::RendererParam param;
    param.set_render_frequency(
        presenter_renderer_params.render_frequency.value());
    renderer_params.push_back(std::move(param));
  }
  if (presenter_renderer_params.shadow_technique.has_value()) {
    fuchsia::ui::gfx::RendererParam param;
    param.set_shadow_technique(
        presenter_renderer_params.shadow_technique.value());
    renderer_params.push_back(std::move(param));
  }

  async::Loop loop(&kAsyncLoopConfigAttachToThread);
  auto startup_context_ = component::StartupContext::CreateFromStartupInfo();

  // Ask the presenter to change renderer params.
  auto presenter =
      startup_context_
          ->ConnectToEnvironmentService<fuchsia::ui::policy::Presenter>();
  presenter.set_error_handler([&loop](zx_status_t status) {
    FXL_LOG(INFO) << "Lost connection to Presenter service.";
    loop.Quit();
  });
  presenter->HACK_SetRendererParams(clipping_enabled,
                                    std::move(renderer_params));

  // Done!
  async::PostTask(loop.dispatcher(), [&loop] { loop.Quit(); });
  loop.Run();
  return 0;
}
