"""Bank of JMU simulation.

This code is nothing like a real bank! But the code shows examples
of functions that don't require decisions or loops. For accuracy,
account balances are stored as integers (but displayed as floats).

Author: Chris Mayfield
Version: 09/18/2023
"""

import random

accounts = []  # account numbers
balances = []  # money, in cents

numbers = list(range(10000, 100000))
random.shuffle(numbers)


def money(amount):
    """Format a balance as dollars and cents.

    >>> money(0)
    "$0.00"
    >>> money(1234567)
    "$12,345.67"

    Args:
        amount (int): balance in cents

    Returns:
        str: formatted money string
    """
    return f"${amount / 100}"


def open_account():
    """Open a new account.

    Returns:
        int: new account number
    """
    print("Opening new account")
    acct = numbers.pop(0)
    accounts.append(acct)
    balances.append(0)
    print(f"Opened account #{acct}")
    return acct


def deposit(acct, amount):
    """Deposit money into an account.

    Args:
        acct (int): account number
        amount (float): money to deposit

    Returns:
        float: updated account balance
    """
    amount = int(round(amount * 100))
    print(f"Depositing {money(amount)} into account #{acct}")
    index = accounts.index(acct)
    balances[index] += amount
    print(f"New balance is {money(balances[index])}")
    return balances[index] / 100


def withdraw(acct, amount):
    """Withdraw money from an account.

    Args:
        acct (int): account number
        amount (float): money to withdraw

    Returns:
        float: updated account balance
    """
    amount = int(round(amount * 100))
    print(f"Withdrawing {money(amount)} from account #{acct}")
    index = accounts.index(acct)
    balances[index] -= amount
    print(f"New balance is {money(balances[index])}")
    return balances[index] / 100
