// Copyright 2018 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_WEB_APPLICATIONS_WEB_APP_PROVIDER_H_
#define CHROME_BROWSER_WEB_APPLICATIONS_WEB_APP_PROVIDER_H_

#include <memory>

#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/one_shot_event.h"
#include "base/types/pass_key.h"
#include "build/build_config.h"
#include "components/keyed_service/core/keyed_service.h"

class Profile;

namespace base {
class Clock;
}  // namespace base

namespace content {
class WebContents;
}

namespace web_app {

class AbstractWebAppDatabaseFactory;
class ExtensionsManager;
class ExternallyManagedAppManager;
class FakeWebAppProvider;
class FileUtilsWrapper;
class GeneratedIconFixManager;
class IsolatedWebAppInstallationManager;
class IsolatedWebAppPolicyManager;
class IsolatedWebAppUpdateManager;
class ManifestUpdateManager;
class NavigationCapturingLog;
class OsIntegrationManager;
class PreinstalledWebAppManager;
class VisitedManifestManager;
class WebAppAudioFocusIdMap;
class WebAppCommandManager;
class WebAppCommandScheduler;
class WebAppIconManager;
class WebAppInstallFinalizer;
class WebAppInstallManager;
class WebAppOriginAssociationManager;
class WebAppPolicyManager;
class WebAppRegistrar;
class WebAppRegistrarMutable;
class WebAppSyncBridge;
class WebAppTranslationManager;
class WebAppUiManager;
class WebContentsManager;
class WebAppProfileDeletionManager;

#if BUILDFLAG(IS_CHROMEOS)
class WebAppRunOnOsLoginManager;
class IwaBundleCacheManager;
#endif

// WebAppProvider is the heart of Chrome web app code.
//
// Connects Web App features, such as the installation of default and
// policy-managed web apps, with Profiles (as WebAppProvider is a
// Profile-linked KeyedService) and their associated PrefService.
//
// Lifecycle notes:
// - WebAppProvider and its sub-managers are not ready for use until the
//   on_registry_ready() event has fired. Its database must be loaded from
//   disk before it can be interacted with.
//   Example of waiting for on_registry_ready():
//   WebAppProvider* provider = WebAppProvider::GetForWebApps(profile);
//   provider->on_registry_ready().Post(
//       FROM_HERE,
//       base::BindOnce([](WebAppProvider& provider) {
//         ...
//       }, std::ref(*provider)));
// - All subsystems are constructed independently of each other in the
//   WebAppProvider constructor.
// - Subsystem construction should have no side effects and start no tasks.
// - Tests can replace any of the subsystems before Start() is called.
// - Similarly, in destruction, subsystems should not refer to each other.
class WebAppProvider : public KeyedService {
 public:
  // Deprecated: Use GetForWebApps instead.
  static WebAppProvider* GetDeprecated(Profile* profile);

  // This returns a WebAppProvider for the given `profile`, or `nullptr` if
  // installed web apps are not supported on the given `profile`. Use
  // `web_app::AreWebAppsEnabled` to determine if web apps are supported on a
  // profile.
  // Note: On ChromeOS, to support the system web app implementation, this also
  // considers the `profile`'s 'original' profile, if `AreWebAppsEnabled`
  // returns `false` for `profile`.
  // TODO(https://crbug.com/384063076): Stop returning the WebAppProvider for
  // profiles where `AreWebAppsEnabled` returns `false` to support CrOS system
  // web apps.
  static WebAppProvider* GetForWebApps(Profile* profile);

  // Returns the WebAppProvider for the current process.
  //
  // Avoid using this function where possible and prefer GetForWebApps which
  // provides a guarantee they are being called from the correct process.
  // TODO(https://crbug.com/384063076): Stop returning the WebAppProvider for
  // profiles where `AreWebAppsEnabled` returns `false` to support CrOS system
  // web apps.
  static WebAppProvider* GetForLocalAppsUnchecked(Profile* profile);

  // Return the WebAppProvider for tests. Blocks if the web app registry is not
  // yet ready.
  // This returns  `nullptr` if installed web apps are not supported on the
  // given `profile`. Use `web_app::AreWebAppsEnabled` to determine if web apps
  // are supported on a profile.
  // Note: On ChromeOS, to support the system web app implementation, this also
  // considers the `profile`'s 'original' profile, if `AreWebAppsEnabled`
  // returns `false` for `profile`.
  // TODO(https://crbug.com/384063076): Stop returning the WebAppProvider for
  // profiles where `AreWebAppsEnabled` returns `false` to support CrOS system
  // web apps.
  static WebAppProvider* GetForTest(Profile* profile);

  // See `GetForWebApps` above for when this returns `nullptr`.
  static WebAppProvider* GetForWebContents(content::WebContents* web_contents);

  using OsIntegrationManagerFactory =
      std::unique_ptr<OsIntegrationManager> (*)(Profile*);

  explicit WebAppProvider(Profile* profile);
  WebAppProvider(const WebAppProvider&) = delete;
  WebAppProvider& operator=(const WebAppProvider&) = delete;
  ~WebAppProvider() override;

  // Start the Web App system. This will run subsystem startup tasks.
  void Start();

  // Read/write to web app system should use `scheduler()` to guarantee safe
  // access. This is safe to access even if the `WebAppProvider` is not ready.
  WebAppCommandScheduler& scheduler();
  //  This is safe to access even if the `WebAppProvider` is not ready.
  WebAppCommandManager& command_manager();

  // Web App sub components. These should only be accessed after
  // `on_registry_ready()` is signaled.

  // Unsafe access to the app registry model. For safe access use locks (see
  // chrome/browser/web_applications/locks/ for more info).
  WebAppRegistrar& registrar_unsafe();
  const WebAppRegistrar& registrar_unsafe() const;
  // Must be exclusively accessed by WebAppSyncBridge.
  WebAppRegistrarMutable& registrar_mutable(base::PassKey<WebAppSyncBridge>);
  // Unsafe access to the WebAppSyncBridge. Reading or data from here should be
  // considered an 'uncommitted read', and writing data is unsafe and could
  // interfere with other operations. For safe access use locks to ensure no
  // operations (like install/update/uninstall/etc) are currently running. See
  // chrome/browser/web_applications/locks/ for more info.
  WebAppSyncBridge& sync_bridge_unsafe();
  // UIs can use WebAppInstallManager for user-initiated Web Apps install.
  WebAppInstallManager& install_manager();
  // Implements persistence for Web Apps install.
  WebAppInstallFinalizer& install_finalizer();
  // Keeps app metadata up to date with site manifests.
  ManifestUpdateManager& manifest_update_manager();
  // Clients can use ExternallyManagedAppManager to install, uninstall, and
  // update Web Apps.
  ExternallyManagedAppManager& externally_managed_app_manager();
  // Clients can use WebAppPolicyManager to request updates of policy installed
  // Web Apps.
  WebAppPolicyManager& policy_manager();
  // `IsolatedWebAppInstallationManager` is the entry point for Isolated Web App
  // installation.
  IsolatedWebAppInstallationManager& isolated_web_app_installation_manager();
  // Keeps Isolated Web Apps up to date by regularly checking for updates,
  // downloading them, and applying them.
  IsolatedWebAppUpdateManager& iwa_update_manager();

#if BUILDFLAG(IS_CHROMEOS)
  // Runs web apps on OS login.
  WebAppRunOnOsLoginManager& run_on_os_login_manager();

  // Isolated Web App bundle cache manager.
  IwaBundleCacheManager& iwa_cache_manager();
#endif

  IsolatedWebAppPolicyManager& iwa_policy_manager();

  WebAppUiManager& ui_manager();

  WebAppAudioFocusIdMap& audio_focus_id_map();

  // Interface for file access, allowing mocking for tests. `scoped_refptr` for
  // thread safety as this is used on other task runners.
  scoped_refptr<FileUtilsWrapper> file_utils();

  // Implements fetching of app icons.
  WebAppIconManager& icon_manager();

  WebAppTranslationManager& translation_manager();

  // Manage all OS hooks that need to be deployed during Web Apps install
  OsIntegrationManager& os_integration_manager();
  const OsIntegrationManager& os_integration_manager() const;

  WebAppOriginAssociationManager& origin_association_manager();

  WebContentsManager& web_contents_manager();

  PreinstalledWebAppManager& preinstalled_web_app_manager();

  ExtensionsManager& extensions_manager();

  GeneratedIconFixManager& generated_icon_fix_manager();

  AbstractWebAppDatabaseFactory& database_factory();

  VisitedManifestManager& visited_manifest_manager();

  NavigationCapturingLog& navigation_capturing_log();

  base::Clock& clock();

  // TODO(https://crbug.com/440635434): Move this to the FakeWebAppProvider when
  // it can be used in browsertests.
  void SetClockForTesting(base::Clock* clock);

  // KeyedService:
  void Shutdown() override;

  // Signals when app registry becomes ready.
  const base::OneShotEvent& on_registry_ready() const {
    return on_registry_ready_;
  }

  // Signals when external app managers have finished calling
  // `SynchronizeInstalledApps`, which means that all installs or uninstalls for
  // external managers have been scheduled. Specifically these calls are
  // triggered from the PreinstalledWebAppManager and the WebAppPolicyManager.
  // Note: This does not include the call from the ChromeOS SystemWebAppManager,
  // which is a separate keyed service.
  const base::OneShotEvent& on_external_managers_synchronized() const {
    return on_external_managers_synchronized_;
  }

  // Returns whether the app registry is ready.
  bool is_registry_ready() const { return is_registry_ready_; }

  base::WeakPtr<WebAppProvider> AsWeakPtr();

  // Returns a nullptr in the default implementation
  virtual FakeWebAppProvider* AsFakeWebAppProviderForTesting();

#if BUILDFLAG(IS_MAC)
  void DoDelayedPostStartupWork();
#endif

 protected:
  virtual void StartImpl();

  void CreateSubsystems(Profile* profile);

  // Wire together subsystems but do not start them (yet).
  void ConnectSubsystems();

  // Start sync bridge. All other subsystems depend on it.
  void StartSyncBridge();
  void OnSyncBridgeReady();

  void CheckIsConnected() const;

  std::unique_ptr<AbstractWebAppDatabaseFactory> database_factory_;
  std::unique_ptr<WebAppRegistrarMutable> registrar_;
  std::unique_ptr<WebAppSyncBridge> sync_bridge_;
  std::unique_ptr<PreinstalledWebAppManager> preinstalled_web_app_manager_;
  std::unique_ptr<WebAppIconManager> icon_manager_;
  std::unique_ptr<WebAppTranslationManager> translation_manager_;
  std::unique_ptr<WebAppInstallFinalizer> install_finalizer_;
  std::unique_ptr<ManifestUpdateManager> manifest_update_manager_;
  std::unique_ptr<ExternallyManagedAppManager> externally_managed_app_manager_;
  std::unique_ptr<WebAppAudioFocusIdMap> audio_focus_id_map_;
  std::unique_ptr<WebAppInstallManager> install_manager_;
  std::unique_ptr<WebAppPolicyManager> web_app_policy_manager_;
  std::unique_ptr<IsolatedWebAppInstallationManager>
      isolated_web_app_installation_manager_;
  std::unique_ptr<IsolatedWebAppUpdateManager> iwa_update_manager_;
  std::unique_ptr<IsolatedWebAppPolicyManager> isolated_web_app_policy_manager_;
#if BUILDFLAG(IS_CHROMEOS)
  std::unique_ptr<WebAppRunOnOsLoginManager> web_app_run_on_os_login_manager_;
  std::unique_ptr<IwaBundleCacheManager> iwa_cache_manager_;
#endif  // BUILDFLAG(IS_CHROMEOS)
  std::unique_ptr<WebAppUiManager> ui_manager_;
  std::unique_ptr<OsIntegrationManager> os_integration_manager_;
  std::unique_ptr<WebAppCommandManager> command_manager_;
  std::unique_ptr<WebAppCommandScheduler> command_scheduler_;
  std::unique_ptr<WebAppOriginAssociationManager> origin_association_manager_;
  std::unique_ptr<WebContentsManager> web_contents_manager_;
  std::unique_ptr<ExtensionsManager> extensions_manager_;
  std::unique_ptr<GeneratedIconFixManager> generated_icon_fix_manager_;
  scoped_refptr<FileUtilsWrapper> file_utils_;
  std::unique_ptr<VisitedManifestManager> visited_manifest_manager_;
  std::unique_ptr<NavigationCapturingLog> navigation_capturing_log_;
  std::unique_ptr<WebAppProfileDeletionManager> profile_deletion_manager_;
  raw_ptr<base::Clock> clock_;

  base::OneShotEvent on_registry_ready_;
  base::OneShotEvent on_external_managers_synchronized_;

  const raw_ptr<Profile> profile_;

  // Ensures that ConnectSubsystems() is not called after Start().
  bool started_ = false;
  bool connected_ = false;
  bool is_registry_ready_ = false;

  base::WeakPtrFactory<WebAppProvider> weak_ptr_factory_{this};
};

}  // namespace web_app

#endif  // CHROME_BROWSER_WEB_APPLICATIONS_WEB_APP_PROVIDER_H_
