// Copyright 2014 The Chromium 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 "mojo/services/view_manager/display_manager.h"

#include "base/numerics/safe_conversions.h"
#include "cc/surfaces/surface_id_allocator.h"
#include "mojo/converters/geometry/geometry_type_converters.h"
#include "mojo/converters/surfaces/surfaces_type_converters.h"
#include "mojo/public/cpp/application/application_connection.h"
#include "mojo/services/public/cpp/surfaces/surfaces_utils.h"
#include "mojo/services/public/interfaces/gpu/gpu.mojom.h"
#include "mojo/services/public/interfaces/surfaces/quads.mojom.h"
#include "mojo/services/view_manager/connection_manager.h"

namespace mojo {
namespace service {
namespace {

gfx::Rect ConvertRectToRoot(const ServerView* view, const gfx::Rect& bounds) {
  gfx::Point origin(bounds.origin());
  while (view->parent()) {
    origin += view->bounds().OffsetFromOrigin();
    view = view->parent();
    if (!view->visible())
      return gfx::Rect();
  }
  return gfx::Rect(origin, bounds.size());
}

void DrawViewTree(Pass* pass, const ServerView* view, gfx::Vector2d offset) {
  if (!view->visible())
    return;

  gfx::Rect node_bounds = view->bounds() + offset;
  std::vector<const ServerView*> children(view->GetChildren());
  for (std::vector<const ServerView*>::reverse_iterator it = children.rbegin();
       it != children.rend();
       ++it) {
    DrawViewTree(pass, *it, offset + view->bounds().OffsetFromOrigin());
  }

  cc::SurfaceId node_id = view->surface_id();

  SurfaceQuadStatePtr surface_quad_state = SurfaceQuadState::New();
  surface_quad_state->surface = SurfaceId::From(node_id);

  gfx::Transform node_transform;
  node_transform.Translate(node_bounds.x(), node_bounds.y());

  QuadPtr surface_quad = Quad::New();
  surface_quad->material = Material::MATERIAL_SURFACE_CONTENT;
  surface_quad->rect = Rect::From(node_bounds);
  surface_quad->opaque_rect = Rect::From(node_bounds);
  surface_quad->visible_rect = Rect::From(node_bounds);
  surface_quad->needs_blending = true;
  surface_quad->shared_quad_state_index =
      base::saturated_cast<int32_t>(pass->shared_quad_states.size());
  surface_quad->surface_quad_state = surface_quad_state.Pass();

  SharedQuadStatePtr sqs = CreateDefaultSQS(*Size::From(node_bounds.size()));
  sqs->content_to_target_transform = Transform::From(node_transform);

  pass->quads.push_back(surface_quad.Pass());
  pass->shared_quad_states.push_back(sqs.Pass());
}

}  // namespace

DisplayManager::DisplayManager(
    ApplicationConnection* app_connection,
    ConnectionManager* connection_manager,
    const Callback<void()>& native_viewport_closed_callback)
    : connection_manager_(connection_manager),
      in_setup_(false),
      size_(800, 600),
      draw_timer_(false, false),
      weak_factory_(this) {
  app_connection->ConnectToService("mojo:native_viewport_service",
                                   &native_viewport_);
  native_viewport_.set_client(this);
  native_viewport_->Create(
      Size::From(size_),
      base::Bind(&DisplayManager::OnCreatedNativeViewport,
                 weak_factory_.GetWeakPtr()));
  native_viewport_->Show();
  app_connection->ConnectToService("mojo:surfaces_service", &surfaces_service_);
  surfaces_service_->CreateSurfaceConnection(base::Bind(
      &DisplayManager::OnSurfaceConnectionCreated, weak_factory_.GetWeakPtr()));

  NativeViewportEventDispatcherPtr event_dispatcher;
  app_connection->ConnectToService(&event_dispatcher);
  native_viewport_->SetEventDispatcher(event_dispatcher.Pass());
}

DisplayManager::~DisplayManager() {
}

void DisplayManager::SchedulePaint(const ServerView* view,
                                   const gfx::Rect& bounds) {
  if (!view->visible())
    return;
  gfx::Rect root_relative_rect = ConvertRectToRoot(view, bounds);
  if (root_relative_rect.IsEmpty())
    return;
  dirty_rect_.Union(root_relative_rect);
  if (!draw_timer_.IsRunning()) {
    draw_timer_.Start(
        FROM_HERE,
        base::TimeDelta(),
        base::Bind(&DisplayManager::Draw, base::Unretained(this)));
  }
}

void DisplayManager::SetViewportSize(const gfx::Size& size) {
  native_viewport_->SetSize(Size::From(size));
}

void DisplayManager::OnCreatedNativeViewport(uint64_t native_viewport_id) {
}

void DisplayManager::OnSurfaceConnectionCreated(SurfacePtr surface,
                                                uint32_t id_namespace) {
  surface_ = surface.Pass();
  surface_.set_client(this);
  surface_id_allocator_.reset(new cc::SurfaceIdAllocator(id_namespace));
  Draw();
}

void DisplayManager::Draw() {
  if (!surface_)
    return;
  if (surface_id_.is_null()) {
    surface_id_ = surface_id_allocator_->GenerateId();
    surface_->CreateSurface(SurfaceId::From(surface_id_), Size::From(size_));
  }

  Rect rect;
  rect.width = size_.width();
  rect.height = size_.height();
  PassPtr pass = CreateDefaultPass(1, rect);
  pass->damage_rect = Rect::From(dirty_rect_);

  DrawViewTree(pass.get(), connection_manager_->root(), gfx::Vector2d());

  FramePtr frame = Frame::New();
  frame->passes.push_back(pass.Pass());
  frame->resources.resize(0u);
  surface_->SubmitFrame(SurfaceId::From(surface_id_), frame.Pass());

  native_viewport_->SubmittedFrame(SurfaceId::From(surface_id_));

  dirty_rect_ = gfx::Rect();
}

void DisplayManager::OnDestroyed() {
  native_viewport_closed_callback_.Run();
}

void DisplayManager::OnSizeChanged(SizePtr size) {
  size_ = size.To<gfx::Size>();
  connection_manager_->root()->SetBounds(gfx::Rect(size_));
  if (surface_id_.is_null())
    return;
  surface_->DestroySurface(SurfaceId::From(surface_id_));
  surface_id_ = cc::SurfaceId();
  SchedulePaint(connection_manager_->root(), gfx::Rect(size_));
}

void DisplayManager::ReturnResources(Array<ReturnedResourcePtr> resources) {
  DCHECK_EQ(0u, resources.size());
}

}  // namespace service
}  // namespace mojo
