// 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 CHROME_BROWSER_GLIC_HOST_GLIC_PAGE_HANDLER_H_
#define CHROME_BROWSER_GLIC_HOST_GLIC_PAGE_HANDLER_H_

#include <memory>
#include <vector>

#include "base/callback_list.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "chrome/browser/glic/host/glic.mojom.h"
#include "chrome/browser/glic/host/glic_webui.mojom.h"
#include "chrome/browser/glic/host/host.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote.h"

namespace content {
class BrowserContext;
class WebContents;
}  // namespace content
namespace gfx {
class Size;
}  // namespace gfx

namespace glic {
class GlicKeyedService;

// Handles the Mojo requests coming from the Glic WebUI.
class GlicPageHandler : public glic::mojom::PageHandler,
                        public PanelStateObserver,
                        public Host::Observer {
 public:
  GlicPageHandler(content::WebContents* webui_contents,
                  Host* host,
                  mojo::PendingReceiver<glic::mojom::PageHandler> receiver,
                  mojo::PendingRemote<glic::mojom::Page> page);

  GlicPageHandler(const GlicPageHandler&) = delete;
  GlicPageHandler& operator=(const GlicPageHandler&) = delete;

  ~GlicPageHandler() override;

  content::WebContents* webui_contents();

  void NotifyWindowIntentToShow();

  void Zoom(mojom::ZoomAction zoom_action, ZoomSource source);

  Host& host();

  // glic::mojom::PageHandler implementation.

  void CreateWebClient(::mojo::PendingReceiver<glic::mojom::WebClientHandler>
                           web_client_receiver) override;
  void PrepareForClient(base::OnceCallback<void(mojom::PrepareForClientResult)>
                            callback) override;
  // Called whenever the webview main frame commits.
  void WebviewCommitted(const GURL& origin) override;

  void OnZoomLevelChange(double zoom_factor) override;

  void ClosePanel(ClosePanelCallback callback) override;

  void OpenProfilePickerAndClosePanel() override;

  void SignInAndClosePanel() override;

  void OpenDisabledByAdminLinkAndClosePanel() override;

  void OpenHelpCenterTopicAndClosePanel(
      glic::mojom::HelpCenterTopic topic) override;

  void ResizeWidget(const gfx::Size& size,
                    base::TimeDelta duration,
                    ResizeWidgetCallback callback) override;

  void EnableDragResize(bool enabled) override;

  // TODO(crbug.com/454120908): Remove this method after WebContents warming is
  // rolled out.
  // Called any time the ready state of the profile changes.
  // `ready_state` = `GlicEnabling::GetProfileReadyState()`.
  void SetProfileReadyState(glic::mojom::ProfileReadyState ready_state);
  void UpdateProfileReadyState();

  void OnWebUiStateChanged(glic::mojom::WebUiState new_state) override;

  // Host::Observer implementation.
  void ClientReadyToShow(const mojom::OpenPanelInfo& open_info) override;

  // PanelStateObserver implementation.
  void PanelStateChanged(const glic::mojom::PanelState& panel_state) override;

  void UpdatePageState(mojom::PanelStateKind panelStateKind);


 private:
  GlicKeyedService* GetGlicService();

  // Cleared when the page handler unregisters.
  raw_ptr<Host> host_;
  raw_ptr<content::WebContents> webui_contents_;
  raw_ptr<content::BrowserContext> browser_context_;
  mojo::Receiver<glic::mojom::PageHandler> receiver_;
  mojo::Remote<glic::mojom::Page> page_;
  mojo::Remote<glic::mojom::WebClient> web_client_;
  std::vector<base::CallbackListSubscription> subscriptions_;
  base::WeakPtrFactory<GlicPageHandler> weak_ptr_factory_{this};
};

}  // namespace glic
#endif  // CHROME_BROWSER_GLIC_HOST_GLIC_PAGE_HANDLER_H_
