'use client'
import { __awaiter } from '../../../../_virtual/_tslib.js';
import { useCallback } from 'react';
import { StorageService, PHANTOM_REDIRECT_CONNECTION_TYPE_KEY } from '@dynamic-labs/utils';
import { isPhantomRedirectConnector } from '@dynamic-labs/wallet-connector-core';
import { PHANTOM_SIGNATURE_STATE } from '../../utils/constants/localStorage.js';
import { getSiweStatement } from '../../utils/functions/getSiweStatement/getSiweStatement.js';
import { dynamicEvents } from '../../events/dynamicEvents.js';
import '../DynamicContext/DynamicContext.js';
import '../../store/state/loadingAndLifecycle/loadingAndLifecycle.js';
import '@dynamic-labs/iconic';
import 'react/jsx-runtime';
import { useViewContext } from '../ViewContext/ViewContext.js';
import '../../shared/logger.js';
import '@dynamic-labs/wallet-book';
import '../../utils/constants/colors.js';
import '../../utils/constants/values.js';
import '@dynamic-labs/sdk-api-core';
import '../../shared/consts/index.js';
import '../../store/state/authMode/authMode.js';
import { useInternalDynamicContext } from '../DynamicContext/useDynamicContext/useInternalDynamicContext/useInternalDynamicContext.js';
import { useCaptchaContext } from '../CaptchaContext/CaptchaContext.js';
import { useErrorContext } from '../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 { useVerifyWallet } from '../../utils/hooks/useVerifyWallet/useVerifyWallet.js';
import '../VerificationContext/VerificationContext.js';
import 'react-dom';
import '../../utils/functions/compareChains/compareChains.js';
import '../../views/Passkey/utils/findPrimaryEmbeddedChain/findPrimaryEmbeddedChain.js';
import '../ThemeContext/ThemeContext.js';
import '../../utils/hooks/useUserUpdateRequest/useUpdateUser/userFieldsSchema.js';
import 'bs58';
import '@dynamic-labs/types';
import '../SocialRedirectContext/SocialRedirectContext.js';
import '../AccessDeniedContext/AccessDeniedContext.js';
import '../AccountExistsContext/AccountExistsContext.js';
import '../LoadingContext/LoadingContext.js';
import '../WalletContext/WalletContext.js';
import '../UserWalletsContext/UserWalletsContext.js';
import '../../utils/hooks/useEmbeddedWallet/useSecureEnclaveEmbeddedWallet/constants.js';
import 'yup';
import '../MockContext/MockContext.js';
import '../../views/CollectUserDataView/useFields.js';
import '../FieldsStateContext/FieldsStateContext.js';
import '../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 '../../utils/hooks/useSubdomainCheck/useSubdomainCheck.js';
import '../WalletGroupContext/WalletGroupContext.js';
import '../IpConfigurationContext/IpConfigurationContext.js';
import '../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 '../ErrorContext/hooks/useErrorText/useErrorText.js';
import '../FooterAnimationContext/index.js';
import '../../views/MfaChooseDeviceView/useGetMfaOptions/useGetMfaOptions.js';
import '../PasskeyContext/PasskeyContext.js';
import '../OnrampContext/OnrampContext.js';
import { useTransferWallet } from '../../utils/hooks/useTransferWallet/useTransferWallet.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 { useInternalFundWithWallet } from '../../utils/hooks/useFundWithWallet/useFundWithWallet.js';
import { getPromptAmountParams } from '../../widgets/DynamicWidget/views/ChooseWalletFundingMethod/useFundingMethods/getPromptAmountParams/getPromptAmountParams.js';
import '../../widgets/DynamicWidget/views/ReceiveWalletFunds/ReceiveWalletFunds.js';
import '../../../index.js';
import '../../store/state/tokenBalances.js';
import '../../store/state/multichainBalances.js';
import '../../shared/utils/functions/getInitialUrl/getInitialUrl.js';

const useResponseHandlers = () => {
    const { walletConnectorOptions, displaySiweStatement, environmentId, projectSettings, setIsSingleWalletAccount, connectWallet, setShowAuthFlow, setSelectedWalletConnectorKey, siweStatement, appName, user, } = useInternalDynamicContext();
    const { pushView } = useViewContext();
    const { setErrorMessage } = useErrorContext();
    const { getCaptchaToken } = useCaptchaContext();
    const { promptAmountAndFund } = useInternalFundWithWallet();
    const verifyWallet = useVerifyWallet({
        displaySiweStatement,
        environmentId,
        projectSettings,
        setIsSingleWalletAccount,
    });
    const phantomRedirectConnector = walletConnectorOptions
        .map(({ walletConnector }) => walletConnector)
        .find(isPhantomRedirectConnector);
    const handleConnectResponse = useCallback(() => __awaiter(void 0, void 0, void 0, function* () {
        if (!phantomRedirectConnector) {
            return;
        }
        // this completes the connection step
        yield phantomRedirectConnector.getSession();
        const connectResult = yield connectWallet(phantomRedirectConnector);
        // Check if we have a connection type
        const connectionType = StorageService.getItem(PHANTOM_REDIRECT_CONNECTION_TYPE_KEY);
        // If this is an external wallet funding connection, then we need to
        // complete the wallet transfer.
        // If connectorConsumed is false that means that the connector has not yet
        // verified this connection type and we should ignore it.
        if ((connectionType === null || connectionType === void 0 ? void 0 : connectionType.connectorConsumed) &&
            connectionType.type === 'external-wallet-funding') {
            if (!connectResult)
                return;
            const wallet = phantomRedirectConnector.createWallet({
                address: connectResult.address,
                chain: phantomRedirectConnector.connectedChain,
                connector: phantomRedirectConnector,
                id: 'external-funding-wallet',
                isAuthenticated: false,
                key: phantomRedirectConnector.key,
            });
            // If the connection was initiated by the widget we can carry on with the funding flow
            // Otherwise we simply raise an event to let the customer's code handle the wallet
            dynamicEvents.emit('walletConnectedForFunding', {
                initiatedByWidget: connectionType.initiatedByWidget,
                isPhantomRedirect: true,
                wallet,
            });
            if (!connectionType.initiatedByWidget)
                return;
            const props = getPromptAmountParams({ wallet });
            promptAmountAndFund(props);
            return;
        }
        // Default behavior is to link a wallet
        setShowAuthFlow(true, { ignoreIfIsEmbeddedWidget: true });
        pushView('pending-signature');
        setSelectedWalletConnectorKey('phantom');
    }), [
        phantomRedirectConnector,
        connectWallet,
        setShowAuthFlow,
        pushView,
        setSelectedWalletConnectorKey,
        promptAmountAndFund,
    ]);
    const completeWalletTransfer = useTransferWallet();
    const handleUserResponse = useCallback(() => __awaiter(void 0, void 0, void 0, function* () {
        if (!phantomRedirectConnector) {
            return;
        }
        setSelectedWalletConnectorKey('phantom');
        const [address] = yield phantomRedirectConnector.getConnectedAccounts();
        const method = phantomRedirectConnector.consumeMethod();
        switch (method) {
            case 'signAndSendTransaction': {
                const { signature } = phantomRedirectConnector.extractSignature();
                phantomRedirectConnector.emit('signAndSendTransaction', {
                    signature,
                });
                break;
            }
            case 'signAllTransactions':
                phantomRedirectConnector.emit('signAllTransactions', {
                    transactions: phantomRedirectConnector.extractTransactions(),
                });
                break;
            case 'signTransaction':
                phantomRedirectConnector.emit('signTransaction', {
                    transaction: phantomRedirectConnector.extractTransaction(),
                });
                break;
            case 'signMessage': {
                const { signature, message } = phantomRedirectConnector.extractSignature();
                const signatureState = StorageService.getItem(PHANTOM_SIGNATURE_STATE);
                StorageService.removeItem(PHANTOM_SIGNATURE_STATE);
                if ((signatureState === null || signatureState === void 0 ? void 0 : signatureState.verificationType) === 'awaiting_transfer') {
                    const siweStatementToUse = getSiweStatement({
                        appName,
                        siweStatement,
                    });
                    yield completeWalletTransfer({
                        messageToSignOverride: message,
                        overrideSiweStatement: siweStatementToUse,
                        publicWalletAddress: address,
                        signedMessageOverride: signature,
                        skipEmptyAccountCheck: signatureState.loseOriginalAccountOnTransfer,
                        walletConnector: phantomRedirectConnector,
                    });
                }
                else if ((signatureState === null || signatureState === void 0 ? void 0 : signatureState.verificationType) === 'awaiting_verification' ||
                    !user) {
                    pushView('wallet-redirect-view');
                    yield verifyWallet({
                        captchaToken: getCaptchaToken(),
                        messageToSignOverride: message,
                        publicWalletAddress: address,
                        signedMessageOverride: signature,
                        walletConnector: phantomRedirectConnector,
                    });
                }
                else {
                    phantomRedirectConnector.emit('signMessage', {
                        signature,
                    });
                }
                break;
            }
        }
    }), [
        phantomRedirectConnector,
        setSelectedWalletConnectorKey,
        user,
        appName,
        siweStatement,
        completeWalletTransfer,
        pushView,
        verifyWallet,
        getCaptchaToken,
    ]);
    const handleErrorResponse = useCallback((params) => {
        var _a;
        if (!phantomRedirectConnector)
            return;
        const errorCode = params.get('errorCode');
        const errorMessage = (_a = params.get('errorMessage')) !== null && _a !== void 0 ? _a : undefined;
        if (!errorCode)
            return;
        setErrorMessage(errorCode);
        const method = phantomRedirectConnector.consumeMethod();
        switch (method) {
            case 'signAndSendTransaction':
                phantomRedirectConnector.emit('signAndSendTransaction', {
                    errorCode,
                    errorMessage,
                });
                break;
            case 'signAllTransactions':
                phantomRedirectConnector.emit('signAllTransactions', {
                    errorCode,
                    errorMessage,
                });
                break;
            case 'signTransaction':
                phantomRedirectConnector.emit('signTransaction', {
                    errorCode,
                    errorMessage,
                });
                break;
            case 'signMessage':
                phantomRedirectConnector.emit('signMessage', {
                    errorCode,
                    errorMessage,
                });
                break;
        }
    }, [phantomRedirectConnector, setErrorMessage]);
    return {
        handleConnectResponse,
        handleErrorResponse,
        handleUserResponse,
        phantomRedirectConnector,
    };
};

export { useResponseHandlers };
