import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:integration_test/integration_test.dart';
import 'package:stackwallet/main.dart' as campfireApp;
import 'package:stackwallet/notifications/modal_popup_dialog.dart';
import 'package:stackwallet/pages/settings_view/settings_subviews/network_settings_subviews/add_custom_node_view.dart';
import 'package:stackwallet/utilities/address_utils.dart';
import 'package:stackwallet/widgets/custom_buttons/gradient_button.dart';
import 'package:stackwallet/widgets/custom_buttons/simple_button.dart';
import 'package:stackwallet/widgets/node_card.dart';
import 'package:pretty_qr_code/pretty_qr_code.dart';

import 'bot_runners/create_wallet_until_pin_confirmation.dart';
import 'bots/addressbook/add_address_book_entry_view_bot.dart';
import 'bots/addressbook/address_book_card_bot.dart';
import 'bots/addressbook/address_book_entry_details_view_bot.dart';
import 'bots/addressbook/address_book_view_bot.dart';
import 'bots/addressbook/edit_address_book_entry_view_bot.dart';
import 'bots/lockscreen_view_bot.dart';
import 'bots/main_view_bot.dart';
import 'bots/onboarding/backup_key_warning_bot.dart';
import 'bots/onboarding/create_pin_view_bot.dart';
import 'bots/onboarding/name_your_wallet_view_bot.dart';
import 'bots/onboarding/onboarding_view_bot.dart';
import 'bots/onboarding/terms_and_conditions_bot.dart';
import 'bots/settings/currency_view_bot.dart';
import 'bots/settings/network_settings/add_custom_node_view_bot.dart';
import 'bots/settings/network_settings/network_settings_view_bot.dart';
import 'bots/settings/network_settings/node_details_view_bot.dart';
import 'bots/settings/settings_view_bot.dart';
import 'bots/settings/wallet_backup_view_bot.dart';
import 'bots/settings/wallet_settings/change_pin_view_bot.dart';
import 'bots/settings/wallet_settings/delete_wallet_warning_view_bot.dart';
import 'bots/settings/wallet_settings/rename_wallet_view_bot.dart';
import 'bots/settings/wallet_settings/wallet_delete_mnemonic_view_bot.dart';
import 'bots/settings/wallet_settings_view_bot.dart';

const bool TEST_ADDRESS_BOOK = true;
const bool TEST_NETWORK_SETTINGS = true;
const bool TEST_WALLET_BACKUP = true;
const bool TEST_CURRENCY = true;
const bool TEST_WALLET_SETTINGS = true;

void main() {
  IntegrationTestWidgetsFlutterBinding.ensureInitialized();
  // may fail if a network connection fails somewhere
  testWidgets("settings integration test", (tester) async {
    campfireApp.main();
    await tester.pumpAndSettle(Duration(seconds: 10));

    // robots
    final onboardingViewBot = OnboardingViewBot(tester);
    final termsAndConditionsViewBot = TermsAndConditionsViewBot(tester);
    final nameYourWalletViewBot = NameYourWalletViewBot(tester);
    final createPinViewBot = CreatePinViewBot(tester);
    final backupKeyWarningViewBot = BackupKeyWarningViewBot(tester);
    final mainViewBot = MainViewBot(tester);
    final settingsViewBot = SettingsViewBot(tester);

    // tap create new wallet button
    await onboardingViewBot.ensureVisible();
    await onboardingViewBot.tapCreateNewWallet();
    await termsAndConditionsViewBot.ensureVisible();

    await createWalletUntilPinConfirmation(
      termsAndConditionsViewBot,
      nameYourWalletViewBot,
      createPinViewBot,
    );

    // wait for wallet generation
    await tester.pumpAndSettle(Duration(seconds: 60));

    await backupKeyWarningViewBot.ensureVisible();

    // tap skip to load into main wallet view
    await backupKeyWarningViewBot.tapSkip();
    await mainViewBot.ensureVisible();

    // tap settings button
    await mainViewBot.tapSettings();
    await settingsViewBot.ensureVisible();

    if (TEST_ADDRESS_BOOK) {
      // tap address book
      await settingsViewBot.tapAddressBook();
      final addressBookViewBot = AddressBookViewBot(tester);
      await addressBookViewBot.ensureVisible();

      // add entry
      await addressBookViewBot.tapAdd();
      final addAddressBookEntryViewBot = AddAddressBookEntryViewBot(tester);
      await addAddressBookEntryViewBot.ensureVisible();

      // test back and cancel
      await addAddressBookEntryViewBot.tapBack();
      await addressBookViewBot.ensureVisible();
      await addressBookViewBot.tapAdd();
      await addAddressBookEntryViewBot.tapCancel();
      await addressBookViewBot.ensureVisible();

      // now add an entry
      await addressBookViewBot.tapAdd();
      await addAddressBookEntryViewBot.ensureVisible();
      await addAddressBookEntryViewBot
          .enterAddress("aPjLWDTPQsoPHUTxKBNRzoebDALj3eTcfh");
      await addAddressBookEntryViewBot.enterName("john doe");

      // save entry
      await addAddressBookEntryViewBot.tapSave();
      await addressBookViewBot.ensureVisible();
      final addressBookCardBot = AddressBookCardBot(tester);
      await addressBookCardBot.ensureVisible();

      // expand options
      await addressBookCardBot.toggleExpandCard();

      // tap copy
      await addressBookCardBot.tapCopy();
      expect((await Clipboard.getData(Clipboard.kTextPlain))!.text,
          "aPjLWDTPQsoPHUTxKBNRzoebDALj3eTcfh");
      expect(find.text("Address copied to clipboard"), findsOneWidget);
      await tester.pumpAndSettle(Duration(seconds: 2));

      // clear clipboard
      await Clipboard.setData(ClipboardData(text: ""));

      // tap details
      await addressBookCardBot.tapDetails();
      final addressBookEntryDetailsViewBot =
          AddressBookEntryDetailsViewBot(tester);
      await addressBookEntryDetailsViewBot.ensureVisible();

      // tap back then go back to details
      await addressBookEntryDetailsViewBot.tapBack();
      await addressBookCardBot.ensureVisible();
      await addressBookCardBot.tapDetails();
      await addressBookEntryDetailsViewBot.ensureVisible();

      // copy address
      await addressBookEntryDetailsViewBot.tapCopyAddress();
      expect((await Clipboard.getData(Clipboard.kTextPlain))!.text,
          "aPjLWDTPQsoPHUTxKBNRzoebDALj3eTcfh");
      expect(find.text("Address copied to clipboard"), findsOneWidget);
      await tester.pumpAndSettle(Duration(seconds: 2));

      // clear clipboard
      await Clipboard.setData(ClipboardData(text: ""));

      // delete and cancel
      await addressBookEntryDetailsViewBot.tapMore();
      await addressBookEntryDetailsViewBot.tapDelete();
      await addressBookEntryDetailsViewBot.tapCancelDelete();

      // delete and confirm
      await addressBookEntryDetailsViewBot.tapMore();
      await addressBookEntryDetailsViewBot.tapDelete();
      await addressBookEntryDetailsViewBot.tapConfirmDelete();
      await addressBookViewBot.ensureVisible();

      // add and save another entry, then go to details
      await addressBookViewBot.tapAdd();
      await addAddressBookEntryViewBot.ensureVisible();
      await addAddressBookEntryViewBot
          .enterAddress("aPjLWDTPQsoPHUTxKBNRzoebDALj3eTcfh");
      await addAddressBookEntryViewBot.enterName("john doe");
      await addAddressBookEntryViewBot.tapSave();
      await addressBookViewBot.ensureVisible();
      await addressBookCardBot.ensureVisible();
      await addressBookCardBot.toggleExpandCard();
      await addressBookCardBot.tapDetails();
      await addressBookEntryDetailsViewBot.ensureVisible();

      // tap edit
      await addressBookEntryDetailsViewBot.tapEdit();
      final editAddressBookEntryViewBot = EditAddressBookEntryViewBot(tester);
      await editAddressBookEntryViewBot.ensureVisible();

      // tap back
      await editAddressBookEntryViewBot.tapBack();
      await addressBookEntryDetailsViewBot.ensureVisible();
      await addressBookEntryDetailsViewBot.tapEdit();
      await editAddressBookEntryViewBot.ensureVisible();

      // tap cancel
      await editAddressBookEntryViewBot.tapCancel();
      await addressBookEntryDetailsViewBot.ensureVisible();
      await addressBookEntryDetailsViewBot.tapEdit();
      await editAddressBookEntryViewBot.ensureVisible();

      // tap save without editing
      await editAddressBookEntryViewBot.tapSave();
      await addressBookEntryDetailsViewBot.ensureVisible();
      await addressBookEntryDetailsViewBot.tapEdit();
      await editAddressBookEntryViewBot.ensureVisible();

      // tap save with editing
      await editAddressBookEntryViewBot.enterName("jane doe");
      await editAddressBookEntryViewBot
          .enterAddress("aPjLWDTPQsoPHUTxKBNRzoebDALj3eTcfh");

      await editAddressBookEntryViewBot.tapSave();
      await addressBookViewBot.ensureVisible();
      await addressBookCardBot.ensureVisible();

      // expand and tap send
      await addressBookCardBot.toggleExpandCard();
      await addressBookCardBot.tapSend();
      await mainViewBot.ensureVisible();

      // go to details and send
      await mainViewBot.tapSettings();
      await settingsViewBot.tapAddressBook();
      await addressBookCardBot.toggleExpandCard();
      await addressBookCardBot.tapDetails();
      await addressBookEntryDetailsViewBot.tapSend();
      await mainViewBot.ensureVisible();

      // open settings again to continue testing
      await mainViewBot.tapSettings();
      await settingsViewBot.ensureVisible();
    }

    if (TEST_NETWORK_SETTINGS) {
      // network settings
      await settingsViewBot.tapNetwork();
      final networkSettingsViewBot = NetworkSettingsViewBot(tester);
      await networkSettingsViewBot.ensureVisible();

      // test back
      await networkSettingsViewBot.tapBack();
      await settingsViewBot.tapNetwork();
      await networkSettingsViewBot.ensureVisible();
      expect(find.byType(NodeCard), findsOneWidget);

      // test add node back
      await networkSettingsViewBot.tapAdd();
      final addCustomNodeViewBot = AddCustomNodeViewBot(tester);
      await addCustomNodeViewBot.ensureVisible();
      await addCustomNodeViewBot.tapBack();
      await networkSettingsViewBot.tapAdd();
      await addCustomNodeViewBot.ensureVisible();

      // test add node
      await addCustomNodeViewBot.enterNodeName("MyNode");
      await addCustomNodeViewBot.enterNodeAddress("MyNodeAddress");
      await addCustomNodeViewBot.enterNodePort("0");

      // tap test connection
      await addCustomNodeViewBot.tapTestConnection();
      expect(find.text("Connection failed!"), findsOneWidget);
      await tester.pumpAndSettle(Duration(seconds: 2));

      // test save non connecting node
      await addCustomNodeViewBot.tapSave();
      expect(find.byType(CouldNotConnectOnSaveDialog), findsOneWidget);
      await tester
          .tap(find.byKey(Key("couldNotConnectOnSaveConfirmSaveButtonKey")));
      await tester.pumpAndSettle();
      await networkSettingsViewBot.ensureVisible();
      expect(find.byType(NodeCard), findsNWidgets(2));

      // tap default node to get context menu
      expect(find.text("Connect"), findsNothing);
      expect(find.text("Details"), findsNothing);
      expect(find.text("Edit"), findsNothing);
      expect(find.text("Delete"), findsNothing);
      await networkSettingsViewBot.tapNode("Campfire default");
      expect(find.text("Connect"), findsOneWidget);
      expect(find.text("Details"), findsOneWidget);
      expect(find.text("Edit"), findsNothing);
      expect(find.text("Delete"), findsNothing);

      // tap connect
      await tester.tap(find.text("Connect"));
      await tester.pumpAndSettle();

      // tap details
      await networkSettingsViewBot.tapNode("Campfire default");
      await tester.tap(find.text("Details"));
      await tester.pumpAndSettle();
      final nodeDetailsViewBot = NodeDetailsViewBot(tester);
      await nodeDetailsViewBot.ensureVisible();

      // tap test connection
      await nodeDetailsViewBot.tapTestConnection();
      await tester.pumpAndSettle(Duration(seconds: 3));

      // tap back
      await nodeDetailsViewBot.tapBack();
      await networkSettingsViewBot.ensureVisible();

      // tap custom node to get context menu
      expect(find.text("Connect"), findsNothing);
      expect(find.text("Details"), findsNothing);
      expect(find.text("Edit"), findsNothing);
      expect(find.text("Delete"), findsNothing);
      await networkSettingsViewBot.tapNode("MyNode");
      expect(find.text("Connect"), findsOneWidget);
      expect(find.text("Details"), findsOneWidget);
      expect(find.text("Edit"), findsOneWidget);
      expect(find.text("Delete"), findsOneWidget);

      // tap details
      await tester.tap(find.text("Details"));
      await tester.pumpAndSettle();
      await nodeDetailsViewBot.ensureVisible();

      // test back
      await nodeDetailsViewBot.tapBack();
      await networkSettingsViewBot.ensureVisible();
      await networkSettingsViewBot.tapNode("MyNode");
      await tester.tap(find.text("Details"));
      await tester.pumpAndSettle();
      await nodeDetailsViewBot.ensureVisible();

      // tap test connection
      await nodeDetailsViewBot.tapTestConnection();
      expect(find.text("Connection failed!"), findsOneWidget);
      await tester.pumpAndSettle(Duration(seconds: 2));

      // open context and edit
      await nodeDetailsViewBot.tapMoreAndEdit();

      // tap disabled save
      await nodeDetailsViewBot.tapSave();
      await nodeDetailsViewBot.ensureVisible();

      // edit and save node
      await nodeDetailsViewBot.tapUseSSLCheckbox();
      await nodeDetailsViewBot.enterName("MyNode2");
      await nodeDetailsViewBot.tapSave();
      await networkSettingsViewBot.ensureVisible();
      expect(find.text("MyNode2"), findsOneWidget);
      expect(find.text("MyNode"), findsNothing);

      // tap delete node from details view
      await networkSettingsViewBot.tapNode("MyNode2");
      await tester.tap(find.text("Details"));
      await tester.pumpAndSettle();
      await nodeDetailsViewBot.tapMoreAndDelete();

      // cancel delete
      expect(find.byType(ModalPopupDialog), findsOneWidget);
      await nodeDetailsViewBot.tapCancelDelete();
      expect(find.byType(ModalPopupDialog), findsNothing);

      // confirm delete
      await nodeDetailsViewBot.tapMoreAndDelete();
      await nodeDetailsViewBot.tapConfirmDelete();
      await networkSettingsViewBot.ensureVisible();
      // expect only the default node now
      expect(find.byType(NodeCard), findsOneWidget);

      // create new node to test remaining two context options
      // on the main network settings page
      await networkSettingsViewBot.tapAdd();
      await addCustomNodeViewBot.ensureVisible();
      await addCustomNodeViewBot.enterNodeName("MyNode");
      await addCustomNodeViewBot.enterNodeAddress("MyNodeAddress");
      await addCustomNodeViewBot.enterNodePort("0");
      await addCustomNodeViewBot.tapSave();
      await tester
          .tap(find.byKey(Key("couldNotConnectOnSaveConfirmSaveButtonKey")));
      await tester.pumpAndSettle();
      await networkSettingsViewBot.ensureVisible();
      expect(find.byType(NodeCard), findsNWidgets(2));

      // tap edit node from the main network settings page, then save
      await networkSettingsViewBot.tapNode("MyNode");
      await tester.tap(find.text("Edit"));
      await tester.pumpAndSettle();
      await nodeDetailsViewBot.ensureVisible();
      await nodeDetailsViewBot.enterName("MyNode3");
      await nodeDetailsViewBot.enterAddress("somenewaddress");
      await nodeDetailsViewBot.enterPort("00");
      await nodeDetailsViewBot.tapUseSSLCheckbox();
      await tester.tap(find.text("Use SSL"));
      await tester.pumpAndSettle();
      await nodeDetailsViewBot.tapSave();
      await networkSettingsViewBot.ensureVisible();

      // tap edit node from the main network settings page, then back
      await networkSettingsViewBot.tapNode("MyNode3");
      await tester.tap(find.text("Edit"));
      await tester.pumpAndSettle();
      await nodeDetailsViewBot.tapBack();
      await networkSettingsViewBot.ensureVisible();

      // tap delete node from the main network settings page, then cancel
      await networkSettingsViewBot.tapNode("MyNode3");
      await tester.tap(find.text("Delete"));
      await tester.pumpAndSettle();
      await tester.tap(find.byType(SimpleButton));
      await tester.pumpAndSettle();
      await networkSettingsViewBot.ensureVisible();
      expect(find.byType(NodeCard), findsNWidgets(2));

      // tap delete node from the main network settings page, then confirm
      await networkSettingsViewBot.tapNode("MyNode3");
      await tester.tap(find.text("Delete"));
      await tester.pumpAndSettle();
      await tester.tap(find.byType(GradientButton));
      await tester.pumpAndSettle();
      await networkSettingsViewBot.ensureVisible();
      expect(find.byType(NodeCard), findsOneWidget);

      // go back to main settings
      await networkSettingsViewBot.tapBack();
      await settingsViewBot.ensureVisible();
    }

    if (TEST_WALLET_BACKUP) {
      await settingsViewBot.tapWalletBackup();
      final lockscreenViewBot = LockscreenViewBot(tester);
      await lockscreenViewBot.ensureVisible();

      // test back
      await lockscreenViewBot.tapBack();
      await settingsViewBot.ensureVisible();
      await settingsViewBot.tapWalletBackup();

      // enter wrong pin
      await lockscreenViewBot.enterPin("2222");
      await tester.pumpAndSettle(Duration(seconds: 2));
      await lockscreenViewBot.ensureVisible();

      // test back again
      await lockscreenViewBot.tapBack();
      await settingsViewBot.ensureVisible();
      await settingsViewBot.tapWalletBackup();

      // enter correct pin
      await lockscreenViewBot.enterPin("1234");
      await tester.pumpAndSettle(Duration(seconds: 2));
      final walletBackUpViewBot = WalletBackUpViewBot(tester);
      await walletBackUpViewBot.ensureVisible();

      // tap copy
      await Clipboard.setData(ClipboardData(text: ""));
      await walletBackUpViewBot.tapCopy();
      final mnemonic =
          (await Clipboard.getData(Clipboard.kTextPlain))!.text!.split(" ");
      expect(mnemonic.length, 24);
      await tester.pumpAndSettle(Duration(seconds: 2));
      await Clipboard.setData(ClipboardData(text: ""));

      // tap qr code then cancel
      await walletBackUpViewBot.tapQrCode();
      final qr = find.byType(PrettyQr).evaluate().first.widget as PrettyQr;
      expect(qr.data, AddressUtils.encodeQRSeedData(mnemonic));
      await walletBackUpViewBot.tapQrCodeCancel();
      expect(find.byType(ModalPopupDialog), findsNothing);

      // tap back to settings
      await walletBackUpViewBot.tapBack();
      await settingsViewBot.ensureVisible();
    }

    if (TEST_CURRENCY) {
      // change to a different currency from default USD
      await settingsViewBot.tapCurrency();
      final currencyViewBot = CurrencyViewBot(tester);
      await currencyViewBot.ensureVisible();
      await currencyViewBot.tapCurrency("CHF");

      // go back to main view to check for "CHF"
      await currencyViewBot.tapBack();
      await settingsViewBot.ensureVisible();
      await settingsViewBot.tapBack();
      await mainViewBot.ensureVisible();
      expect(find.text("CHF"), findsOneWidget);

      // open settings again to continue testing
      await mainViewBot.tapSettings();
      await settingsViewBot.ensureVisible();
    }

    if (TEST_WALLET_SETTINGS) {
      // tap wallet settings
      await settingsViewBot.tapWalletSettings();
      final walletSettingsViewBot = WalletSettingsViewBot(tester);
      await walletSettingsViewBot.ensureVisible();

      // test all change pin back taps
      await walletSettingsViewBot.tapChangePIN();
      final lockScreenViewBot = LockscreenViewBot(tester);
      await lockScreenViewBot.ensureVisible();
      await lockScreenViewBot.tapBack();
      await walletSettingsViewBot.tapChangePIN();
      await lockScreenViewBot.enterPin("1234");
      await tester.pumpAndSettle(Duration(seconds: 2));
      final changePinViewBot = ChangePinViewBot(tester);
      await changePinViewBot.ensureVisible();
      await changePinViewBot.tapBack();
      await walletSettingsViewBot.tapChangePIN();
      await lockScreenViewBot.enterPin("1234");
      await tester.pumpAndSettle(Duration(seconds: 2));
      await changePinViewBot.enterPin();
      await changePinViewBot.tapBack();
      await walletSettingsViewBot.ensureVisible();

      // change pin with a few fails
      await walletSettingsViewBot.tapChangePIN();
      await lockScreenViewBot.enterPin("2222");
      await tester.pumpAndSettle(Duration(seconds: 2));
      await lockScreenViewBot.enterPin("1234");
      await tester.pumpAndSettle(Duration(seconds: 2));
      await changePinViewBot.enterPin();
      await changePinViewBot.confirmUnmatchedPin();
      await changePinViewBot.enterPin();
      await changePinViewBot.confirmUnmatchedPin();
      await changePinViewBot.enterPin();
      await changePinViewBot.confirmMatchedPin();
      await walletSettingsViewBot.ensureVisible();
      await tester.pumpAndSettle(Duration(seconds: 2));

      // change pin with no fails
      await walletSettingsViewBot.tapChangePIN();
      await lockScreenViewBot.enterPin("2222");
      await tester.pumpAndSettle(Duration(seconds: 2));
      await lockScreenViewBot.enterPin("1234");
      await tester.pumpAndSettle(Duration(seconds: 2));
      await changePinViewBot.enterPin();
      await changePinViewBot.confirmMatchedPin();
      await walletSettingsViewBot.ensureVisible();
      await tester.pumpAndSettle(Duration(seconds: 2));

      // biometrics doesn't test well as it prompts for system settings
      // await walletSettingsViewBot.tapToggleBiometrics();
      // await walletSettingsViewBot.tapCancelBiometricsSystemSettingsDialog();

      // rename wallet save
      await walletSettingsViewBot.tapRenameWallet();
      final renameWalletViewBot = RenameWalletViewBot(tester);
      await renameWalletViewBot.tapSave();
      await renameWalletViewBot.enterWalletName("My Firo Wallet2");
      await renameWalletViewBot.tapSave();

      await walletSettingsViewBot.tapRenameWallet();
      expect(find.text("My Firo Wallet2"), findsOneWidget);
      await renameWalletViewBot.enterWalletName("My Firo Wallet");
      await renameWalletViewBot.tapSave();

      // tap back
      await walletSettingsViewBot.tapRenameWallet();
      await renameWalletViewBot.tapBack();
      await walletSettingsViewBot.ensureVisible();

      // tap clear cache and cancel
      await walletSettingsViewBot.tapClearCache();
      await walletSettingsViewBot.tapCancelClearCache();
      await walletSettingsViewBot.ensureVisible();

      // tap clear cache and clear
      await walletSettingsViewBot.tapClearCache();
      await walletSettingsViewBot.tapClearOnClearCache();
      await walletSettingsViewBot.tapOkOnCacheClearedAlert();
      await walletSettingsViewBot.ensureVisible();

      // tap delete wallet and cancel
      await walletSettingsViewBot.tapDeleteWallet();
      await walletSettingsViewBot.tapCancelDeleteConfirmationDialog();

      // tap delete wallet and continue running though
      // and testing back taps throughout
      await walletSettingsViewBot.tapDeleteWallet();
      await walletSettingsViewBot.tapDeleteOnDeleteConfirmationDialog();
      await lockScreenViewBot.ensureVisible();
      await lockScreenViewBot.tapBack();

      await walletSettingsViewBot.tapDeleteWallet();
      await walletSettingsViewBot.tapDeleteOnDeleteConfirmationDialog();
      await lockScreenViewBot.ensureVisible();
      await lockScreenViewBot.enterPin("9999");
      await tester.pumpAndSettle(Duration(seconds: 2));
      await lockScreenViewBot.ensureVisible();
      await lockScreenViewBot.tapBack();

      await walletSettingsViewBot.tapDeleteWallet();
      await walletSettingsViewBot.tapDeleteOnDeleteConfirmationDialog();
      await lockScreenViewBot.ensureVisible();
      await lockScreenViewBot.enterPin("1234");
      await tester.pumpAndSettle(Duration(seconds: 2));
      final deleteWalletWarningViewBot = DeleteWalletWarningViewBot(tester);
      await deleteWalletWarningViewBot.ensureVisible();
      await deleteWalletWarningViewBot.tapBack();
      await walletSettingsViewBot.ensureVisible();

      await walletSettingsViewBot.tapDeleteWallet();
      await walletSettingsViewBot.tapDeleteOnDeleteConfirmationDialog();
      await lockScreenViewBot.ensureVisible();
      await lockScreenViewBot.enterPin("1234");
      await tester.pumpAndSettle(Duration(seconds: 2));
      await deleteWalletWarningViewBot.ensureVisible();
      await deleteWalletWarningViewBot.tapCancelAndGoBack();
      await walletSettingsViewBot.ensureVisible();

      // finally go through and tap view backup key
      await walletSettingsViewBot.tapDeleteWallet();
      await walletSettingsViewBot.tapDeleteOnDeleteConfirmationDialog();
      await lockScreenViewBot.ensureVisible();
      await lockScreenViewBot.enterPin("1234");
      await tester.pumpAndSettle(Duration(seconds: 2));
      await deleteWalletWarningViewBot.ensureVisible();
      await deleteWalletWarningViewBot.tapViewBackupKey();
      final walletDeleteMnemonicViewBot = WalletDeleteMnemonicViewBot(tester);
      await walletDeleteMnemonicViewBot.ensureVisible();

      // test back
      await walletDeleteMnemonicViewBot.tapBack();
      await deleteWalletWarningViewBot.ensureVisible();
      await deleteWalletWarningViewBot.tapViewBackupKey();
      await walletDeleteMnemonicViewBot.ensureVisible();

      // tap qr code
      await walletDeleteMnemonicViewBot.tapQrCode();
      await walletDeleteMnemonicViewBot.tapCancelQrCode();
      await walletDeleteMnemonicViewBot.ensureVisible();

      // tap copy
      await Clipboard.setData(ClipboardData(text: ""));
      await walletDeleteMnemonicViewBot.tapCopy();
      final mnemonic =
          (await Clipboard.getData(Clipboard.kTextPlain))!.text!.split(" ");
      expect(mnemonic.length, 24);
      await tester.pumpAndSettle(Duration(seconds: 2));
      await Clipboard.setData(ClipboardData(text: ""));
      await walletDeleteMnemonicViewBot.ensureVisible();

      // tap continue and cancel
      await walletDeleteMnemonicViewBot.tapContinue();
      await walletDeleteMnemonicViewBot.tapCancelContinue();
      await walletDeleteMnemonicViewBot.ensureVisible();

      // tap continue and finally confirm deletion
      await walletDeleteMnemonicViewBot.tapContinue();
      await walletDeleteMnemonicViewBot.tapConfirmContinue();
      await onboardingViewBot.ensureVisible();
    }
  });
}