import 'package:flutter_test/flutter_test.dart';
import 'package:integration_test/integration_test.dart';
import 'package:stackwallet/main.dart' as campfireApp;

import 'bot_runners/create_wallet_until_pin_confirmation.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/receive_view_bot.dart';
import 'bots/send_view_bot.dart';
import 'bots/settings/settings_view_bot.dart';
import 'bots/transaction/transaction_search_view_bot.dart';
import 'bots/wallet_view_bot.dart';

void main() {
  IntegrationTestWidgetsFlutterBinding.ensureInitialized();
  testWidgets("wallet, send, and receive view 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);
    final walletViewBot = WalletViewBot(tester);
    final transactionSearchViewBot = TransactionSearchViewBot(tester);
    final sendViewBot = SendViewBot(tester);
    final receiveViewBot = ReceiveViewBot(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 refresh
    await mainViewBot.tapRefresh();

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

    // tap back to main wallet view
    await settingsViewBot.tapBack();
    await mainViewBot.ensureVisible();

    await walletViewBot.ensureVisible();

    // wait for refresh notification that covers switch to disappear
    await tester.pumpAndSettle(Duration(seconds: 3));

    // tap switch
    await walletViewBot.tapAvailableFullSwitch();
    await walletViewBot.checkAvailableFullSwitchIsDisabled();

    // drag switch
    await walletViewBot.dragAvailableFullSwitchRight();
    await walletViewBot.checkAvailableFullSwitchIsDisabled();

    // drag switch
    await walletViewBot.dragAvailableFullSwitchLeft();
    await walletViewBot.checkAvailableFullSwitchIsEnabled();

    // tap switch again
    await walletViewBot.tapAvailableFullSwitch();
    await walletViewBot.checkAvailableFullSwitchIsDisabled();

    // tap tx search
    await walletViewBot.tapTransactionSearch();
    await transactionSearchViewBot.ensureVisible();

    // go back
    await transactionSearchViewBot.tapX();
    await walletViewBot.ensureVisible();

    // go to send tab
    await mainViewBot.tapSend();
    await sendViewBot.ensureVisible();

    // go to receive tab
    await mainViewBot.tapReceive();
    await receiveViewBot.ensureVisible();
  });
}