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

#ifndef WEBLAYER_BROWSER_WEBAPPS_WEBLAYER_WEBAPPS_CLIENT_H_
#define WEBLAYER_BROWSER_WEBAPPS_WEBLAYER_WEBAPPS_CLIENT_H_

#include <set>

#include "base/memory/weak_ptr.h"
#include "base/no_destructor.h"
#include "build/build_config.h"
#include "components/webapps/browser/webapps_client.h"

class GURL;

namespace url {
class Origin;
}

namespace weblayer {

class WebLayerWebappsClient : public webapps::WebappsClient {
 public:
  // Called when the scheduling of an WebAPK installation with the Chrome
  // service finished or failed.
  using WebApkInstallFinishedCallback = base::OnceCallback<void(GURL, GURL)>;

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

  static void Create();

  // WebappsClient:
  bool IsOriginConsideredSecure(const url::Origin& origin) override;
  security_state::SecurityLevel GetSecurityLevelForWebContents(
      content::WebContents* web_contents) override;
  infobars::ContentInfoBarManager* GetInfoBarManagerForWebContents(
      content::WebContents* web_contents) override;
  webapps::WebappInstallSource GetInstallSource(
      content::WebContents* web_contents,
      webapps::InstallTrigger trigger) override;
  webapps::AppBannerManager* GetAppBannerManager(
      content::WebContents* web_contents) override;
#if BUILDFLAG(IS_ANDROID)
  bool IsInstallationInProgress(content::WebContents* web_contents,
                                const GURL& manifest_url,
                                const GURL& manifest_id) override;
  bool CanShowAppBanners(content::WebContents* web_contents) override;
  void OnWebApkInstallInitiatedFromAppMenu(
      content::WebContents* web_contents) override;
  void InstallWebApk(content::WebContents* web_contents,
                     const webapps::AddToHomescreenParams& params) override;
  void InstallShortcut(content::WebContents* web_contents,
                       const webapps::AddToHomescreenParams& params) override;
#endif

 private:
  friend base::NoDestructor<WebLayerWebappsClient>;

  WebLayerWebappsClient();
  ~WebLayerWebappsClient() override;

  void OnInstallFinished(GURL manifest_url, GURL manifest_id);

  std::set<GURL> current_installs_;
  std::set<GURL> current_install_ids_;

  // Used to get |weak_ptr_|.
  base::WeakPtrFactory<WebLayerWebappsClient> weak_ptr_factory_{this};
};

}  // namespace weblayer

#endif  // WEBLAYER_BROWSER_WEBAPPS_WEBLAYER_WEBAPPS_CLIENT_H_