// 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 "sky/compositor/surface_holder.h"

#include "base/bind.h"
#include "base/message_loop/message_loop.h"
#include "mojo/converters/geometry/geometry_type_converters.h"
#include "mojo/public/cpp/application/connect.h"
#include "mojo/public/interfaces/application/shell.mojom.h"
#include "sky/compositor/surface_allocator.h"

namespace sky {

SurfaceHolder::Client::~Client() {
}

SurfaceHolder::SurfaceHolder(Client* client, mojo::Shell* shell)
    : client_(client), weak_factory_(this) {
  mojo::ServiceProviderPtr service_provider;
  shell->ConnectToApplication("mojo:surfaces_service",
                              mojo::GetProxy(&service_provider));
  mojo::ConnectToService(service_provider.get(), &surfaces_service_);

  surfaces_service_->CreateSurfaceConnection(base::Bind(
      &SurfaceHolder::OnSurfaceConnectionCreated, weak_factory_.GetWeakPtr()));
}

SurfaceHolder::~SurfaceHolder() {
  if (surface_ && surface_id_)
    surface_->DestroySurface(surface_id_.Clone());
}

bool SurfaceHolder::IsReadyForFrame() const {
  return surface_;
}

void SurfaceHolder::SubmitFrame(mojo::FramePtr frame,
                                const base::Closure& callback) {
  surface_->SubmitFrame(surface_id_.Clone(), frame.Pass(), callback);
}

void SurfaceHolder::SetSize(const gfx::Size& size) {
  if (surface_id_ && size_ == size)
    return;

  if (surface_id_) {
    surface_->DestroySurface(surface_id_.Clone());
  } else {
    surface_id_ = mojo::SurfaceId::New();
  }

  surface_id_ = surface_allocator_->CreateSurfaceId();
  surface_->CreateSurface(surface_id_.Clone());
  size_ = size;

  client_->OnSurfaceIdAvailable(surface_id_.Clone());
}

void SurfaceHolder::SetIdNamespace(uint32_t id_namespace) {
}

void SurfaceHolder::ReturnResources(
    mojo::Array<mojo::ReturnedResourcePtr> resources) {
  // TODO(abarth): The surface service shouldn't spam us with empty calls.
  if (!resources.size())
    return;
  client_->ReturnResources(resources.Pass());
}

void SurfaceHolder::OnSurfaceConnectionCreated(mojo::SurfacePtr surface,
                                               uint32_t id_namespace) {
  surface_ = surface.Pass();
  surface_.set_client(this);
  surface_allocator_.reset(new SurfaceAllocator(id_namespace));
  client_->OnSurfaceConnectionCreated();
}

}  // namespace sky
