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

#import "base/memory/weak_ptr.h"
#import "components/webauthn/ios/ios_passkey_client.h"

@class PasskeyKeychainProviderBridge;
@protocol PasskeyKeychainProviderBridgeDelegate;
class ProfileIOS;

namespace web {
class WebState;
}  // namespace web

// Chrome side implementation of the IOSPasskeyClient interface.
class IOSChromePasskeyClient : public webauthn::IOSPasskeyClient {
 public:
  IOSChromePasskeyClient(web::WebState* web_state);
  ~IOSChromePasskeyClient() override;

  // IOSPasskeyClient overrides.
  void SetIOSPasskeyClientCommandsHandler(
      id<IOSPasskeyClientCommands> handler) override;
  void FetchKeys(
      webauthn::ReauthenticatePurpose purpose,
      webauthn::PasskeyUserVerificationStatus user_verification_status,
      webauthn::FetchKeysCallback callback) override;
  void ShowSuggestionBottomSheet(RequestInfo request_info) override;
  void ShowCreationBottomSheet(RequestInfo request_info) override;
  void ShowInterstitial(InterstitialCallback callback) override;
  void AllowPasskeyCreationInfobar(bool allowed) override;
  void CancelPasskeyRequest(RequestInfo request_info) override;
  bool IsGpmPasskeySavingEnabled() const override;
  bool IsBiometricsEnabled() const override;
  void OnPasskeyCreated() override;

  id<IOSPasskeyClientCommands> GetCommandHandler() const;

 private:
  PasskeyKeychainProviderBridge* GetPasskeyKeychainProviderBridge();

  // Pointer to the associated ProfileIOS. Must outlive
  // IOSChromePasskeyClient.
  raw_ptr<ProfileIOS> profile_;

  // Command handler for the browser.
  id<IOSPasskeyClientCommands> command_handler_;

  // Bridge to the PasskeyKeychainProvider and its delegate.
  PasskeyKeychainProviderBridge* passkey_keychain_provider_bridge_;
  id<PasskeyKeychainProviderBridgeDelegate> bridge_delegate_;

  // Weak WebState.
  base::WeakPtr<web::WebState> web_state_;
};

#endif  // IOS_CHROME_BROWSER_WEBAUTHN_MODEL_IOS_CHROME_PASSKEY_CLIENT_H_
