/**
   * Entry point for program.
   *
   * @param args the user can provide a filename.txt to read/store banking info.
   */
  public static void main(String[] args) {
    theBank = null;
    try {
      try {
        in = new Scanner(System.in);

        // To be used for reading from and writing to file
        DataParser bankParser = new DataParser();

        String filename = null;
        String bankName = null;
        // Retrieve the filename from args if there is one supplied
        if (args.length > 0) {
          filename = args[0];
          // Reads in bank data from file
          bankParser.readData(filename);
          bankName = bankParser.getBankName();
          LinkedList<BankAccount> accounts = bankParser.getAccounts();
          LinkedList<BankCustomer> customers = bankParser.getCustomers();

          theBank = new Bank(bankName, accounts, customers);
        } else {
          // Asks user for bank name and filename
          System.out.println("Welcome! I'm a bank, but I forgot my name.");
          System.out.print("What's my name?: ");
          bankName = in.nextLine();

          boolean isValidFilename = false;
          while (!isValidFilename) {
            System.out.print(
                "Please provide a filename to store all banking data (filename.txt): ");
            filename = in.nextLine();

            // Checks that filename has extension txt
            String validFilename =
                ".+[.]txt"; // filename must contain at least 1 of any character followed by .txt
            if (filename.matches(validFilename)) {
              isValidFilename = true;
            }
          }
          theBank = new Bank(bankName);
        }

        System.out.println("\n\nWelcome to " + theBank.getName() + "!");

        // Displays a menu of available actions and asks user to choose an action
        boolean done = false;
        while (!done) {
          done = menu();
        }

        System.out.println("Have a splendid day!");

        // Write all banking data to file
        bankParser.writeData(
            filename,
            theBank.getName(),
            theBank.getTotalBalance(),
            theBank.getAllAccounts(),
            theBank.getAllCustomers());

      } finally {
        if (in != null) {
          in.close();
        }
      }
    } catch (FileNotFoundException e) {
      System.out.println("\nThe bank data file was not found.");
    } catch (BadDataException e) {
      System.out.println("\nThe data provided in the file is corrupt.");
    }
  }