/**
   * This method opens a bank account
   *
   * @param bankName
   * @param firstName
   * @param lastName
   * @param emailId
   * @param phoneNumber
   * @param password
   * @return accountNumber
   */
  @Override
  public String openAccount(
      String bank,
      String firstName,
      String lastName,
      String emailId,
      String phoneNumber,
      String password) {

    accountCount++;

    if (accountCount == 3) {
      return "Anunay";
    }
    System.out.println("1");
    try {
      blockingQueue.put(
          new Date()
              + ": "
              + firstName
              + " "
              + lastName
              + " has initiated a request to open an account at "
              + bank);
    } catch (InterruptedException e) {
      System.out.println(e.getMessage());
      e.printStackTrace();
    }

    Customer account = new Customer();

    account.setFirstName(firstName);
    account.setLastName(lastName);
    account.setEmailId(emailId);
    account.setPhoneNumber(phoneNumber);
    account.setPassword(password);
    account.setCreditLimit(1000);

    String accountNo = null;
    synchronized (counter) {
      System.out.println("test1");
      int accountSequence = counter.incrementAndGet();

      accountNo = firstName.charAt(0) + "" + accountSequence;
      // counter.set(new AtomicInteger(accountSequence));
      account.setAccountNumber(accountNo);
    }

    List<Customer> accountList = accountMap.get(accountNo.charAt(0));
    System.out.println("test2");
    if (accountList == null) {
      System.out.println("test3");
      accountList = new ArrayList<Customer>();
    } else {
      Iterator<Customer> accountIterator = accountList.iterator();
      System.out.println("test4");
      while (accountIterator.hasNext()) {
        Customer acct = accountIterator.next();

        if ((acct.getFirstName()).equals(firstName)
            && (acct.getLastName().equals(lastName))
            && (acct.getEmailId()).equals(emailId)) {

          return "Already-" + acct.getAccountNumber();
        }
        System.out.println("test5");
      }
    }

    synchronized (accountList) {
      System.out.println("test6");
      accountList.add(account);
      accountMap.put(firstName.charAt(0), accountList);
      System.out.println("test7");
    }
    System.out.println("test8");
    return accountNo;
  }