// Copyright 2017 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.

#ifndef GARNET_EXAMPLES_UI_SHADERTOY_SERVICE_APP_H_
#define GARNET_EXAMPLES_UI_SHADERTOY_SERVICE_APP_H_

#include <fuchsia/examples/shadertoy/cpp/fidl.h>

#include <lib/async-loop/cpp/loop.h>
#include <lib/zx/eventpair.h>

#include "garnet/examples/ui/shadertoy/service/shadertoy_impl.h"
#include "lib/component/cpp/startup_context.h"
#include "lib/escher/escher.h"
#include "lib/fidl/cpp/binding_set.h"

#include "garnet/examples/ui/shadertoy/service/compiler.h"
#include "garnet/examples/ui/shadertoy/service/renderer.h"

namespace shadertoy {

class ShadertoyState;

// A thin wrapper that manages connections to a ShadertoyFactoryImpl singleton.
// TODO: clean up when there are no remaining bindings to Shadertoy nor
// ShadertoyFactory.  What is the best-practice pattern to use here?
class App : public fuchsia::examples::shadertoy::ShadertoyFactory {
 public:
  App(async::Loop* loop, component::StartupContext* app_context,
      escher::EscherWeakPtr escher);
  ~App();

  escher::Escher* escher() const { return escher_.get(); }

  Compiler* compiler() { return &compiler_; }
  Renderer* renderer() { return &renderer_; }

  static constexpr vk::Format kDefaultImageFormat = vk::Format::eB8G8R8A8Srgb;

 private:
  friend class ShadertoyState;

  // Called by ShadertoyState::Close().
  void CloseShadertoy(ShadertoyState* shadertoy);

  // |ShadertoyFactory|
  void NewImagePipeShadertoy(
      fidl::InterfaceRequest<fuchsia::examples::shadertoy::Shadertoy>
          toy_request,
      fidl::InterfaceHandle<fuchsia::images::ImagePipe> image_pipe) override;

  // |ShadertoyFactory|
  void NewViewShadertoy(
      fidl::InterfaceRequest<fuchsia::examples::shadertoy::Shadertoy>
          toy_request,
      zx::eventpair view_token, bool handle_input_events) override;

  fidl::BindingSet<fuchsia::examples::shadertoy::ShadertoyFactory>
      factory_bindings_;
  fidl::BindingSet<fuchsia::examples::shadertoy::Shadertoy,
                   std::unique_ptr<ShadertoyImpl>>
      shadertoy_bindings_;

  const escher::EscherWeakPtr escher_;
  Renderer renderer_;
  Compiler compiler_;

  FXL_DISALLOW_COPY_AND_ASSIGN(App);
};

}  // namespace shadertoy

#endif  // GARNET_EXAMPLES_UI_SHADERTOY_SERVICE_APP_H_
