// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef ASH_ANNOTATOR_ANNOTATOR_CONTROLLER_H_
#define ASH_ANNOTATOR_ANNOTATOR_CONTROLLER_H_

#include <memory>
#include <optional>

#include "ash/annotator/annotator_metrics.h"
#include "ash/ash_export.h"
#include "ash/public/cpp/annotator/annotator_controller_base.h"
#include "base/functional/bind.h"
#include "base/functional/callback.h"
#include "base/functional/callback_forward.h"
#include "base/memory/raw_ptr.h"
#include "base/observer_list.h"
#include "base/observer_list_types.h"
#include "third_party/skia/include/core/SkColor.h"

namespace aura {
class Window;
}  // namespace aura

namespace gfx {
class Rect;
}  // namespace gfx

namespace ash {

struct AnnotatorTool;
class AnnotatorClient;
class AnnotationsOverlayView;
class AnnotationsOverlayController;
class AnnotationSourceWatcher;

// The controller in charge of annotator UI.
class ASH_EXPORT AnnotatorController : public AnnotatorControllerBase {
 public:
  AnnotatorController();
  AnnotatorController(const AnnotatorController&) = delete;
  AnnotatorController& operator=(const AnnotatorController&) = delete;
  ~AnnotatorController() override;

  class AnnotatorObserver : public base::CheckedObserver {
   public:
    virtual void OnAnnotatorStateChanged(bool enabled) {}
  };

  bool is_annotator_enabled() const { return annotator_enabled_; }
  AnnotationSourceWatcher* annotation_source_watcher() {
    return annotation_source_watcher_.get();
  }

  // Sets the annotator tool.
  virtual void SetAnnotatorTool(const AnnotatorTool& tool);
  // Resets annotator tools and clears the canvas.
  void ResetTools();
  // Shows annotation tray for `new_root`.
  void RegisterView(aura::Window* new_root);
  // Hides annotation tray for `current_root` if it was previously registered
  // with the controller.
  void UnregisterView(aura::Window* current_root);
  // Updates `current_root_` to be the given `new_root`. Updates annotation
  // tray's enabled state.
  void UpdateRootView(aura::Window* new_root);
  // Invoked when marker button is pressed.
  void EnableAnnotatorTool();
  // Resets the canvas and disables the annotator functionality.
  void DisableAnnotator();
  // Creates `annotations_overlay_controller_` for the `window`. This is
  // necessary, as it adds a view for annotating on top of the `window` and
  // loads the Ink library in the view. After the call, annotating is still
  // disabled, until the EnableAnnotatorTool() method is called.
  // TODO(b/342104047): Once the markup pod is implemented, make this method
  // private, called from EnableAnnotatorTool(). Add handling for multiple
  // displays.
  void CreateAnnotationOverlayForWindow(
      aura::Window* window,
      std::optional<gfx::Rect> partial_region_bounds);
  void CreateAnnotationOverlayForMarkerMode(aura::Window* window);

  // AnnotatorControllerBase:
  void SetToolClient(AnnotatorClient* client) override;
  bool GetAnnotatorAvailability() const override;
  void OnCanvasInitialized(bool success) override;
  void ToggleAnnotationTray() override;
  void OnUndoRedoAvailabilityChanged(bool undo_available,
                                     bool redo_available) override;

  // Returns a new instance of the concrete view that will be used as the
  // content view of the annotations overlay widget.
  std::unique_ptr<AnnotationsOverlayView> CreateAnnotationsOverlayView() const;

  // Updates the accessible name of the |annotation_tray_| in the accessibility
  // cache.
  void UpdateAnnotationTrayAccessibleName(bool is_annotator_enabled);
  // Adds/removes the specified |observer|.
  void AddObserver(AnnotatorObserver* observer);
  void RemoveObserver(AnnotatorObserver* observer);

  void set_canvas_initialized_callback_for_test(base::OnceClosure callback) {
    on_canvas_initialized_callback_for_test_ = std::move(callback);
  }

 private:
  friend class CaptureModeTestApi;

  // Updates the tray based on annotator availability.
  void UpdateTrayEnabledState();
  // Toggles annotation overlay widget on or off. When on, the annotations
  // overlay widget's window will be shown and can consume all the events
  // targeting the underlying window. Otherwise, it's hidden and cannot accept
  // any events.
  void ToggleAnnotatorCanvas();
  // Notifies observers that the |annotator_enabled_| state has changed.
  void NotifyStateChanged();
  raw_ptr<AnnotatorClient> client_ = nullptr;
  // True if the canvas is initialized successfully, false if it failed to
  // initialize. An absent value indicates that the initialization has not
  // completed.
  std::optional<bool> canvas_initialized_state_;
  bool annotator_enabled_ = false;
  // The current root window for showing annotations.
  raw_ptr<aura::Window> current_root_ = nullptr;
  // If set, will be called when the canvas is initialized.
  base::OnceClosure on_canvas_initialized_callback_for_test_;
  // Controls and owns the overlay widget, which is used to host annotations.
  std::unique_ptr<AnnotationsOverlayController> annotations_overlay_controller_;
  std::unique_ptr<AnnotationSourceWatcher> annotation_source_watcher_;
  base::ObserverList<AnnotatorObserver> observers_;
};

}  // namespace ash

#endif  // ASH_ANNOTATOR_ANNOTATOR_CONTROLLER_H_
