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

#ifndef SHELL_COMMON_ENGINE_H_
#define SHELL_COMMON_ENGINE_H_

#include "flutter/assets/zip_asset_store.h"
#include "flutter/assets/asset_provider.h"
#include "flutter/lib/ui/window/platform_message.h"
#include "flutter/lib/ui/window/viewport_metrics.h"
#include "flutter/runtime/runtime_controller.h"
#include "flutter/runtime/runtime_delegate.h"
#include "flutter/shell/common/rasterizer.h"
#include "lib/fxl/macros.h"
#include "lib/fxl/memory/weak_ptr.h"
#include "third_party/skia/include/core/SkPicture.h"

namespace blink {
class DirectoryAssetBundle;
class ZipAssetBundle;
}  // namespace blink

namespace shell {
class PlatformView;
class Animator;
using PointerDataPacket = blink::PointerDataPacket;

class Engine : public blink::RuntimeDelegate {
 public:
  explicit Engine(PlatformView* platform_view);

  ~Engine() override;

  fml::WeakPtr<Engine> GetWeakPtr();

  static void Init(const std::string& bundle_path);

  void RunBundle(const std::string& bundle_path,
                 const std::string& entrypoint = main_entrypoint_,
                 bool reuse_runtime_controller = false);

  // Uses the given provider to locate assets.
  void RunBundleWithAssets(fxl::RefPtr<blink::AssetProvider> asset_provider,
                           const std::string& bundle_path,
                           const std::string& entrypoint = main_entrypoint_,
                           bool reuse_runtime_controller = false);

  // Uses the given source code instead of looking inside the bundle for the
  // source code.
  void RunBundleAndSource(const std::string& bundle_path,
                          const std::string& main,
                          const std::string& packages,
                          bool reuse_runtime_controller = false);

  void BeginFrame(fxl::TimePoint frame_time);
  void NotifyIdle(int64_t deadline);

  void RunFromSource(const std::string& main,
                     const std::string& packages,
                     const std::string& bundle);
  void SetAssetBundlePath(const std::string& bundle_path);

  Dart_Port GetUIIsolateMainPort();
  std::string GetUIIsolateName();
  bool UIIsolateHasLivePorts();
  tonic::DartErrorHandleType GetUIIsolateLastError();
  tonic::DartErrorHandleType GetLoadScriptError();

  void OnOutputSurfaceCreated(const fxl::Closure& gpu_continuation);
  void OnOutputSurfaceDestroyed(const fxl::Closure& gpu_continuation);
  void SetViewportMetrics(const blink::ViewportMetrics& metrics);
  void DispatchPlatformMessage(fxl::RefPtr<blink::PlatformMessage> message);
  void DispatchPointerDataPacket(const PointerDataPacket& packet);
  void DispatchSemanticsAction(int id,
                               blink::SemanticsAction action,
                               std::vector<uint8_t> args);
  void SetSemanticsEnabled(bool enabled);
  void ScheduleFrame(bool regenerate_layer_tree = true) override;

  void set_rasterizer(fml::WeakPtr<Rasterizer> rasterizer);

 private:
  // RuntimeDelegate methods:
  std::string DefaultRouteName() override;
  void Render(std::unique_ptr<flow::LayerTree> layer_tree) override;
  void UpdateSemantics(blink::SemanticsNodeUpdates update) override;
  void HandlePlatformMessage(
      fxl::RefPtr<blink::PlatformMessage> message) override;
  void DidCreateMainIsolate(Dart_Isolate isolate) override;
  void DidCreateSecondaryIsolate(Dart_Isolate isolate) override;

  void StopAnimator();
  void StartAnimatorIfPossible();

  void DoRunBundle(const std::string& script_uri,
                   const std::string& entrypoint,
                   bool reuse_runtime_controller);

  void ConfigureAssetBundle(const std::string& path);
  void ConfigureRuntime(const std::string& script_uri,
                        bool reuse_runtime_controller = false);

  bool HandleLifecyclePlatformMessage(blink::PlatformMessage* message);
  bool HandleNavigationPlatformMessage(
      fxl::RefPtr<blink::PlatformMessage> message);
  bool HandleLocalizationPlatformMessage(blink::PlatformMessage* message);
  void HandleSettingsPlatformMessage(blink::PlatformMessage* message);

  void HandleAssetPlatformMessage(fxl::RefPtr<blink::PlatformMessage> message);
  bool GetAssetAsBuffer(const std::string& name, std::vector<uint8_t>* data);

  static const std::string main_entrypoint_;

  fxl::RefPtr<blink::AssetProvider> asset_provider_;
  std::weak_ptr<PlatformView> platform_view_;
  std::unique_ptr<Animator> animator_;
  std::unique_ptr<blink::RuntimeController> runtime_;
  tonic::DartErrorHandleType load_script_error_;
  std::string initial_route_;
  blink::ViewportMetrics viewport_metrics_;
  std::string language_code_;
  std::string country_code_;
  std::string user_settings_data_;
  bool semantics_enabled_ = false;
  // TODO(zarah): Remove usage of asset_store_ once app.flx is removed.
  fxl::RefPtr<blink::ZipAssetStore> asset_store_;
  fxl::RefPtr<blink::DirectoryAssetBundle> directory_asset_bundle_;
  // TODO(eseidel): This should move into an AnimatorStateMachine.
  bool activity_running_;
  bool have_surface_;
  fml::WeakPtrFactory<Engine> weak_factory_;

  FXL_DISALLOW_COPY_AND_ASSIGN(Engine);
};

}  // namespace shell

#endif  // SHELL_COMMON_ENGINE_H_
