// 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 "src/ui/examples/embedder/app.h"

#include <fuchsia/sys/cpp/fidl.h>
#include <fuchsia/ui/views/cpp/fidl.h>
#include <lib/async/cpp/task.h>
#include <lib/sys/cpp/file_descriptor.h>
#include <lib/sys/cpp/service_directory.h>
#include <lib/syslog/cpp/macros.h>
#include <lib/ui/scenic/cpp/commands.h>
#include <lib/ui/scenic/cpp/view_token_pair.h>
#include <lib/zx/time.h>
#include <unistd.h>
#include <zircon/types.h>

#include "example_view_provider_service.h"

// Returns a human-readable string for a given embedder process type -
// either container or subview.
static const char* AppTypeString(embedder::AppType type) {
  if (type == embedder::AppType::CONTAINER) {
    return "[CONTAINER] ";
  } else if (type == embedder::AppType::SUBVIEW) {
    return "[SUBVIEW] ";
  } else {
    FX_DCHECK(false);
  }
  return nullptr;
}

namespace embedder {

static fuchsia::sys::ComponentControllerPtr s_subview_controller;

App::App(async::Loop* loop, AppType type)
    : component_context_(sys::ComponentContext::CreateAndServeOutgoingDirectory()),
      loop_(loop),
      type_(type) {
  // Connect the ExampleViewProviderService.
  if (type_ == AppType::CONTAINER) {
    // Launch the subview app.  Clone our stdout and stderr file descriptors
    // into it so output (FX_LOGS, etc) from the subview app will show up as
    // if it came from us.
    fuchsia::sys::LaunchInfo launch_info;
    launch_info.out = sys::CloneFileDescriptor(STDOUT_FILENO);
    launch_info.err = sys::CloneFileDescriptor(STDERR_FILENO);
    launch_info.url = "fuchsia-pkg://fuchsia.com/embedder#meta/subview.cmx";
    auto services = sys::ServiceDirectory::CreateWithRequest(&launch_info.directory_request);
    fuchsia::sys::LauncherSyncPtr launcher;
    component_context_->svc()->Connect(launcher.NewRequest());
    launcher->CreateComponent(std::move(launch_info), s_subview_controller.NewRequest());
    services->Connect(view_provider_.NewRequest());
  } else if (type_ == AppType::SUBVIEW) {
    view_provider_impl_ = std::make_unique<ExampleViewProviderService>(
        component_context_.get(), [this](ViewContext context) {
          // Bind the ServiceProviders, ourselves as the ourgoing one.
          incoming_services_.Bind(std::move(context.incoming_services));
          service_bindings_.AddBinding(this, std::move(context.outgoing_services));

          // Create the View resource.
          view_id_ = session_->AllocResourceId();
          session_->Enqueue(
              scenic::NewCreateViewCmd(view_id_, std::move(context.token), "Subview"));

          if (root_node_id_ != 0) {
            session_->Enqueue(scenic::NewAddChildCmd(view_id_, root_node_id_));
          }
        });
  }

  // Connect to the global Scenic service and begin a session.
  FX_LOGS(INFO) << AppTypeString(type_) << "Connecting to Scenic service.";
  scenic_ = component_context_->svc()->Connect<fuchsia::ui::scenic::Scenic>();
  scenic_.set_error_handler([this](zx_status_t status) {
    FX_LOGS(INFO) << AppTypeString(type_) << "Scenic error.  Connection dropped.";
    ReleaseSessionResources();
    loop_->Quit();
  });
  FX_LOGS(INFO) << AppTypeString(type_) << "Creating new session.";
  session_ = std::make_unique<scenic::Session>(scenic_.get());
  session_->SetDebugName("Embedder");
  session_->set_error_handler([this](zx_status_t status) {
    FX_LOGS(INFO) << AppTypeString(type_) << "Session error.  Connection dropped.";
    ReleaseSessionResources();
    loop_->Quit();
  });

  if (type_ == AppType::CONTAINER) {
    auto [view_token, view_holder_token] = scenic::ViewTokenPair::New();

    // Create the subview and bind the ServiceProviders.
    FX_LOGS(INFO) << AppTypeString(type_) << "Creating view.";
    fuchsia::sys::ServiceProviderPtr outgoing_services;
    outgoing_services.Bind(service_bindings_.AddBinding(this));
    view_provider_->CreateView(std::move(view_token.value), incoming_services_.NewRequest(),
                               std::move(outgoing_services));

    // Create the ViewHolder resource that will proxy the view.
    view_id_ = session_->AllocResourceId();
    session_->Enqueue(
        scenic::NewCreateViewHolderCmd(view_id_, std::move(view_holder_token), "Subview-Holder"));
  }

  // Close the session and quit after several seconds.
  async::PostDelayedTask(
      loop_->dispatcher(),
      [this] {
        FX_LOGS(INFO) << AppTypeString(type_) << "Closing session.";
        ReleaseSessionResources();
        loop_->Quit();
      },
      zx::sec(30));

  // Set up a scene after we get display info, since the scene relies on the
  // size of the display.
  scenic_->GetDisplayInfo([this](fuchsia::ui::gfx::DisplayInfo display_info) {
    const float display_width = static_cast<float>(display_info.width_in_px);
    const float display_height = static_cast<float>(display_info.height_in_px);
    CreateScene(display_width, display_height);

    Update(zx_clock_get_monotonic());
  });
}

App::~App() { ReleaseSessionResources(); }

void App::ReleaseSessionResources() {
  if (session_ != nullptr) {
    if (view_id_ != 0) {
      session_->ReleaseResource(view_id_);
    }
    compositor_.reset();
    camera_.reset();
    session_->Flush();
    session_.reset();
  }
}

void App::Update(uint64_t next_presentation_time) {
  session_->Present(next_presentation_time, [this](fuchsia::images::PresentationInfo info) {
    Update(info.presentation_time + info.presentation_interval);
  });
}

void App::CreateScene(float display_width, float display_height) {
  // The finished scene should contain 2 rounded rectangles, each centered in
  // the screen.  The container process is represented by the larger green
  // rectangle, which the subview process is represented by the smaller pink
  // rectangle.
  auto session_ptr = session_.get();
  scenic::EntityNode root_node(session_ptr);
  root_node_id_ = root_node.id();

  if (type_ == AppType::CONTAINER) {
    compositor_ = std::make_unique<scenic::DisplayCompositor>(session_ptr);
    scenic::LayerStack layer_stack(session_ptr);
    scenic::Layer layer(session_ptr);
    scenic::Renderer renderer(session_ptr);
    scenic::Scene scene(session_ptr);
    camera_ = std::make_unique<scenic::Camera>(scene);

    compositor_->SetLayerStack(layer_stack);
    layer_stack.AddLayer(layer);
    layer.SetSize(display_width, display_height);
    layer.SetRenderer(renderer);
    renderer.SetCamera(camera_->id());

    // Set up lights.
    scenic::AmbientLight ambient_light(session_ptr);
    scenic::DirectionalLight directional_light(session_ptr);
    scene.AddLight(ambient_light);
    scene.AddLight(directional_light);
    ambient_light.SetColor(0.3f, 0.3f, 0.3f);
    directional_light.SetColor(0.7f, 0.7f, 0.7f);
    directional_light.SetDirection(1.f, 1.f, -2.f);

    scene.AddChild(root_node_id_);
  }

  static const float kBackgroundMargin = (type_ == AppType::CONTAINER) ? 100.f : 250.f;
  static const float background_width = display_width - 2.f * kBackgroundMargin;
  static const float background_height = display_height - 2.f * kBackgroundMargin;
  scenic::ShapeNode background_node(session_ptr);
  scenic::RoundedRectangle background_shape(session_ptr, background_width, background_height, 20.f,
                                            20.f, 80.f, 10.f);
  scenic::Material background_material(session_ptr);
  if (type_ == AppType::CONTAINER) {
    background_material.SetColor(120, 255, 120, 255);
  } else if (type_ == AppType::SUBVIEW) {
    background_material.SetColor(218, 112, 214, 255);
  }
  background_node.SetShape(background_shape);
  background_node.SetMaterial(background_material);
  root_node.SetClip(0, true);
  if (type_ == AppType::CONTAINER) {
    root_node.SetTranslation(kBackgroundMargin + background_width * 0.5f,
                             kBackgroundMargin + background_height * 0.5f, -1.f);
  } else {
    root_node.SetTranslation(0.f, 0.f, -1.f);
  }
  root_node.AddChild(background_node);

  if (view_id_ != 0) {
    if (type_ == AppType::CONTAINER) {
      session_->Enqueue(scenic::NewAddChildCmd(root_node_id_, view_id_));
    } else if (type_ == AppType::SUBVIEW) {
      session_->Enqueue(scenic::NewAddChildCmd(view_id_, root_node_id_));
    }
  }
}

}  // namespace embedder
