'use client'
import { useCallback, useMemo } from 'react';
import { WalletProviderEnum } from '@dynamic-labs/sdk-api-core';
import '../../../context/DynamicContext/DynamicContext.js';
import '../../../store/state/loadingAndLifecycle/loadingAndLifecycle.js';
import '@dynamic-labs/iconic';
import '@dynamic-labs/wallet-connector-core';
import 'react/jsx-runtime';
import '../../../context/ViewContext/ViewContext.js';
import '../../../shared/logger.js';
import '@dynamic-labs/wallet-book';
import '@dynamic-labs/utils';
import '../../constants/colors.js';
import '../../constants/values.js';
import '../../../shared/consts/index.js';
import '../../../events/dynamicEvents.js';
import '../../../../../_virtual/_tslib.js';
import '../../../context/CaptchaContext/CaptchaContext.js';
import '../../../context/ErrorContext/ErrorContext.js';
import '@dynamic-labs/multi-wallet';
import 'react-international-phone';
import '../../../store/state/nonce/nonce.js';
import '@dynamic-labs-sdk/client/core';
import '../../../client/client.js';
import '@dynamic-labs-sdk/client';
import '../../../config/ApiEndpoint.js';
import '@dynamic-labs/locale';
import '../../../store/state/dynamicContextProps/dynamicContextProps.js';
import '../../../store/state/primaryWalletId/primaryWalletId.js';
import '../../../store/state/connectedWalletsInfo/connectedWalletsInfo.js';
import '../../../context/AccessDeniedContext/AccessDeniedContext.js';
import '../../../context/AccountExistsContext/AccountExistsContext.js';
import '../../../context/UserWalletsContext/UserWalletsContext.js';
import '../../../store/state/authMode/authMode.js';
import '../../../context/VerificationContext/VerificationContext.js';
import 'react-dom';
import { findWalletOptionFor } from '../../functions/findWalletOptionFor/findWalletOptionFor.js';
import '../../../views/Passkey/utils/findPrimaryEmbeddedChain/findPrimaryEmbeddedChain.js';
import '../../../context/ThemeContext/ThemeContext.js';
import '../useUserUpdateRequest/useUpdateUser/userFieldsSchema.js';
import 'bs58';
import '@dynamic-labs/types';
import '../../../context/SocialRedirectContext/SocialRedirectContext.js';
import '../../../context/LoadingContext/LoadingContext.js';
import '../../../context/WalletContext/WalletContext.js';
import '../useEmbeddedWallet/useSecureEnclaveEmbeddedWallet/constants.js';
import 'yup';
import '../../../context/MockContext/MockContext.js';
import '../../../views/CollectUserDataView/useFields.js';
import '../../../context/FieldsStateContext/FieldsStateContext.js';
import '../../../context/UserFieldEditorContext/UserFieldEditorContext.js';
import '@dynamic-labs/rpc-providers';
import '../../../store/state/walletOptions/walletOptions.js';
import 'react-i18next';
import '../../../components/Accordion/components/AccordionItem/AccordionItem.js';
import '../../../components/Alert/Alert.js';
import '../../../components/ShadowDOM/ShadowDOM.js';
import '../../../components/IconButton/IconButton.js';
import '../../../components/InlineWidget/InlineWidget.js';
import '../../../components/Input/Input.js';
import '../../../components/IsBrowser/IsBrowser.js';
import '../../../components/MenuList/Dropdown/Dropdown.js';
import '../../../components/OverlayCard/OverlayCard.js';
import '../../../components/Transition/ZoomTransition/ZoomTransition.js';
import '../../../components/Transition/SlideInUpTransition/SlideInUpTransition.js';
import '../../../components/Transition/OpacityTransition/OpacityTransition.js';
import '../../../components/PasskeyCreatedSuccessBanner/PasskeyCreatedSuccessBanner.js';
import '../../../components/Popper/Popper/Popper.js';
import '../../../components/Popper/PopperContext/PopperContext.js';
import 'react-focus-lock';
import 'qrcode';
import 'formik';
import '../useSubdomainCheck/useSubdomainCheck.js';
import '../../../context/WalletGroupContext/WalletGroupContext.js';
import '../../../context/IpConfigurationContext/IpConfigurationContext.js';
import '../../../context/ConnectWithOtpContext/ConnectWithOtpContext.js';
import '../../../widgets/DynamicBridgeWidget/views/WalletsView/components/SecondaryWallets/SecondaryWallets.js';
import '@hcaptcha/react-hcaptcha';
import '../../../widgets/DynamicWidget/context/DynamicWidgetContext.js';
import '../../../widgets/DynamicWidget/helpers/convertExchangeKeyAndProviderEnum.js';
import '../../../views/ExchangeWhitelistWarning/ExchangeWhitelistWarning.js';
import '../../../context/ErrorContext/hooks/useErrorText/useErrorText.js';
import '../../../context/FooterAnimationContext/index.js';
import '../../../views/MfaChooseDeviceView/useGetMfaOptions/useGetMfaOptions.js';
import '../../../context/PasskeyContext/PasskeyContext.js';
import '../../../context/OnrampContext/OnrampContext.js';
import '../../functions/compareChains/compareChains.js';
import '../../../store/state/sendBalances.js';
import '../../../store/state/connectorsInitializing/connectorsInitializing.js';
import '../../../components/OverlayCardBase/OverlayCardTarget/OverlayCardTarget.js';
import '../../../widgets/DynamicWidget/components/DynamicWidgetHeader/DynamicWidgetHeader.js';
import '../../../views/TransactionConfirmationView/TransactionConfirmationView.js';
import '../../../widgets/DynamicWidget/components/PasskeyCard/PasskeyCard.js';
import '../../../widgets/DynamicWidget/views/CryptoComOnramp/CryptoComOnramp.js';
import '../../../../index.js';
import '../../../widgets/DynamicWidget/views/ReceiveWalletFunds/ReceiveWalletFunds.js';
import '../../../store/state/tokenBalances.js';
import '../../../store/state/multichainBalances.js';
import '../../../shared/utils/functions/getInitialUrl/getInitialUrl.js';
import { useInternalDynamicContext } from '../../../context/DynamicContext/useDynamicContext/useInternalDynamicContext/useInternalDynamicContext.js';

const useSmartWallets = () => {
    const { user, walletConnectorOptions } = useInternalDynamicContext();
    const getSCWAccount = useCallback((wallet) => {
        const { verifiedCredentials } = user !== null && user !== void 0 ? user : {};
        if (!verifiedCredentials)
            return;
        // Ensure this is a SCW wallet
        const scwAccount = verifiedCredentials.find((credential) => credential.id === wallet.id);
        return (scwAccount === null || scwAccount === void 0 ? void 0 : scwAccount.walletProvider) ===
            WalletProviderEnum.SmartContractWallet
            ? scwAccount
            : undefined;
    }, [user]);
    const getEOAWallet = useCallback((wallet) => {
        var _a, _b, _c;
        const verifiedCredentials = user === null || user === void 0 ? void 0 : user.verifiedCredentials;
        if (!verifiedCredentials)
            return;
        // Ensure this is a SCW wallet
        const scwAccount = getSCWAccount(wallet);
        // Find the EOA account for this SCW
        const eoaAccount = verifiedCredentials.find((credential) => credential.id === (scwAccount === null || scwAccount === void 0 ? void 0 : scwAccount.signerRefId));
        if (!(eoaAccount === null || eoaAccount === void 0 ? void 0 : eoaAccount.address) || !(eoaAccount === null || eoaAccount === void 0 ? void 0 : eoaAccount.chain))
            return;
        const { walletConnector } = (_a = findWalletOptionFor(eoaAccount, walletConnectorOptions)) !== null && _a !== void 0 ? _a : {};
        // It's always authenticated, unless it's a turnkey wallet that still hasn't created a passkey
        const isTurnkey = (_b = eoaAccount.walletName) === null || _b === void 0 ? void 0 : _b.startsWith('turnkey');
        const isAuthenticated = !isTurnkey ||
            Boolean((_c = eoaAccount.walletProperties) === null || _c === void 0 ? void 0 : _c.isAuthenticatorAttached);
        return walletConnector === null || walletConnector === void 0 ? void 0 : walletConnector.createWallet({
            address: eoaAccount.address,
            chain: walletConnector.connectedChain,
            connector: walletConnector,
            id: eoaAccount.id,
            isAuthenticated,
            key: walletConnector.key,
        });
    }, [getSCWAccount, user === null || user === void 0 ? void 0 : user.verifiedCredentials, walletConnectorOptions]);
    const getSmartWallet = useCallback((wallet) => {
        var _a;
        const verifiedCredentials = user === null || user === void 0 ? void 0 : user.verifiedCredentials;
        if (!verifiedCredentials)
            return;
        // Get the EOA account for this wallet
        const eoaAccount = verifiedCredentials.find((credential) => credential.id === wallet.id);
        // Find the smart wallet account for this EOA
        const scwAccount = verifiedCredentials.find((credential) => credential.signerRefId === (eoaAccount === null || eoaAccount === void 0 ? void 0 : eoaAccount.id));
        if (!(scwAccount === null || scwAccount === void 0 ? void 0 : scwAccount.address) || !(scwAccount === null || scwAccount === void 0 ? void 0 : scwAccount.chain))
            return;
        const { walletConnector } = (_a = findWalletOptionFor(scwAccount, walletConnectorOptions)) !== null && _a !== void 0 ? _a : {};
        return walletConnector === null || walletConnector === void 0 ? void 0 : walletConnector.createWallet({
            address: scwAccount.address,
            chain: walletConnector.connectedChain,
            connector: walletConnector,
            id: scwAccount.id,
            isAuthenticated: true,
            key: walletConnector.key,
        });
    }, [user === null || user === void 0 ? void 0 : user.verifiedCredentials, walletConnectorOptions]);
    return useMemo(() => ({
        getEOAWallet,
        getSmartWallet,
        isSmartWallet: (wallet) => getSCWAccount(wallet) !== undefined,
    }), [getEOAWallet, getSCWAccount, getSmartWallet]);
};

export { useSmartWallets };
