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

#ifndef CHROME_BROWSER_UI_PAGE_ACTION_PAGE_ACTION_OBSERVER_H_
#define CHROME_BROWSER_UI_PAGE_ACTION_PAGE_ACTION_OBSERVER_H_

#include <memory>
#include <optional>
#include <string>

#include "ui/actions/action_id.h"

namespace page_actions {

class PageActionObserverImpl;
class PageActionController;

// This is a simple snapshot of a page action's state.
// Each feature has a page action *per-tab*; this represents the page action
// for a single tab.
// Note: this represents the framework-driven state of the page action. E.g.,
// the page action may not be visible due to size-constraints in the view; this
// is not captured.
struct PageActionState {
  PageActionState();
  ~PageActionState();
  PageActionState(const PageActionState&);
  PageActionState& operator=(const PageActionState&);

  bool operator==(const PageActionState& other) const;

  actions::ActionId action_id;
  bool showing = false;
  bool chip_showing = false;
  bool anchored_message_showing = false;

  // Not set if the page action is not showing.
  std::optional<std::u16string> tooltip;
  // Not set if the page action is not showing in chip state.
  std::optional<std::u16string> label;
};

// PageActionObserver observes for events on a tab's page action.
// It is scoped to a specific action_id, provided in the constructor.
class PageActionObserver {
 public:
  explicit PageActionObserver(actions::ActionId action_id);
  virtual ~PageActionObserver();
  PageActionObserver(const PageActionObserver&) = delete;
  PageActionObserver& operator=(const PageActionObserver&) = delete;

  // Invoked when the specified page action icon becomes visible/hidden.
  // This includes page actions in their chip state (see comment below).
  virtual void OnPageActionIconShown(const PageActionState& page_action) {}
  virtual void OnPageActionIconHidden(const PageActionState& page_action) {}

  // Invoked when the specified page action chip becomes visible/hidden.
  // If the chip animates, the chip is considered shown at the start of
  // its expanding animation, and considered hidden at the end of its
  // collapsing animation.
  // This is invoked in addition to the "icon shown" notification.
  virtual void OnPageActionChipShown(const PageActionState& page_action) {}
  virtual void OnPageActionChipHidden(const PageActionState& page_action) {}

  // Invoked when the specified page action anchored message becomes
  // visible/hidden.
  virtual void OnPageActionAnchoredMessageShown(
      const page_actions::PageActionState& page_action) {}
  virtual void OnPageActionAnchoredMessageHidden(
      const page_actions::PageActionState& page_action) {}

  const PageActionState& GetCurrentPageActionState() const;

  // Begins observation of the page action for the given controller.
  void RegisterAsPageActionObserver(PageActionController& controller);

 private:
  const actions::ActionId action_id_;
  std::unique_ptr<PageActionObserverImpl> observer_impl_;
};

}  // namespace page_actions

#endif  // CHROME_BROWSER_UI_PAGE_ACTION_PAGE_ACTION_OBSERVER_H_
