// Copyright 2013 The Flutter 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 FLUTTER_SHELL_PLATFORM_GLFW_CLIENT_WRAPPER_INCLUDE_FLUTTER_FLUTTER_WINDOW_CONTROLLER_H_
#define FLUTTER_SHELL_PLATFORM_GLFW_CLIENT_WRAPPER_INCLUDE_FLUTTER_FLUTTER_WINDOW_CONTROLLER_H_

#include <flutter_glfw.h>

#include <chrono>
#include <memory>
#include <string>
#include <vector>

#include "flutter_window.h"
#include "plugin_registrar.h"
#include "plugin_registry.h"

namespace flutter {

// Properties for Flutter window creation.
struct WindowProperties {
  // The display title.
  std::string title;
  // Width in screen coordinates.
  int32_t width;
  // Height in screen coordinates.
  int32_t height;
  // Whether or not the user is prevented from resizing the window.
  // Reversed so that the default for a cleared struct is to allow resizing.
  bool prevent_resize;
};

// A controller for a window displaying Flutter content.
//
// This is the primary wrapper class for the desktop C API.
// If you use this class, you should not call any of the setup or teardown
// methods in the C API directly, as this class will do that internally.
//
// Note: This is an early implementation (using GLFW internally) which
// requires control of the application's event loop, and is thus useful
// primarily for building a simple one-window shell hosting a Flutter
// application. The final implementation and API will be very different.
class FlutterWindowController : public PluginRegistry {
 public:
  // There must be only one instance of this class in an application at any
  // given time, as Flutter does not support multiple engines in one process,
  // or multiple views in one engine.
  //
  // |icu_data_path| is the path to the icudtl.dat file for the version of
  // Flutter you are using.
  explicit FlutterWindowController(const std::string& icu_data_path);

  virtual ~FlutterWindowController();

  // Prevent copying.
  FlutterWindowController(FlutterWindowController const&) = delete;
  FlutterWindowController& operator=(FlutterWindowController const&) = delete;

  // Creates and displays a window for displaying Flutter content.
  //
  // The |assets_path| is the path to the flutter_assets folder for the Flutter
  // application to be run.
  //
  // The |arguments| are passed to the Flutter engine. See:
  // https://github.com/flutter/engine/blob/main/shell/common/switches.h for
  // for details. Not all arguments will apply to desktop.
  //
  // The |aot_library_path| is the path to the libapp.so file for the Flutter
  // application to be run. While this parameter is only required in AOT mode,
  // it is perfectly safe to provide the path in non-AOT mode too.
  //
  // Only one Flutter window can exist at a time; see constructor comment.
  bool CreateWindow(const WindowProperties& window_properties,
                    const std::string& assets_path,
                    const std::vector<std::string>& arguments,
                    const std::string& aot_library_path = "");

  // Destroys the current window, if any.
  //
  // Because only one window can exist at a time, this method must be called
  // between calls to CreateWindow, or the second one will fail.
  void DestroyWindow();

  // The FlutterWindow managed by this controller, if any. Returns nullptr
  // before CreateWindow is called, after DestroyWindow is called, and after
  // RunEventLoop returns;
  FlutterWindow* window() { return window_.get(); }

  // Processes the next event on this window, or returns early if |timeout| is
  // reached before the next event.
  //
  // Returns false if the window was closed as a result of event processing.
  bool RunEventLoopWithTimeout(
      std::chrono::milliseconds timeout = std::chrono::milliseconds::max());

  // Deprecated. Use RunEventLoopWithTimeout.
  void RunEventLoop();

  // flutter::PluginRegistry:
  FlutterDesktopPluginRegistrarRef GetRegistrarForPlugin(
      const std::string& plugin_name) override;

 private:
  // The path to the ICU data file. Set at creation time since it is the same
  // for any window created.
  std::string icu_data_path_;

  // Whether or not FlutterDesktopInit succeeded at creation time.
  bool init_succeeded_ = false;

  // The owned FlutterWindow, if any.
  std::unique_ptr<FlutterWindow> window_;

  // Handle for interacting with the C API's window controller, if any.
  FlutterDesktopWindowControllerRef controller_ = nullptr;
};

}  // namespace flutter

#endif  // FLUTTER_SHELL_PLATFORM_GLFW_CLIENT_WRAPPER_INCLUDE_FLUTTER_FLUTTER_WINDOW_CONTROLLER_H_
