// A small bank-account model: fields, a constructor, methods,
// exceptions, a record, and formatted output.
package com.example.bank;

import java.util.ArrayList;
import java.util.List;

public class BankAccount {
    private final String owner;
    private long balanceCents;
    private final List<Transaction> history = new ArrayList<>();

    public record Transaction(String kind, long amountCents) {}

    public BankAccount(String owner, long openingCents) {
        this.owner = owner;
        this.balanceCents = openingCents;
        history.add(new Transaction("open", openingCents));
    }

    public void deposit(long cents) {
        if (cents <= 0) {
            throw new IllegalArgumentException("deposit must be positive");
        }
        balanceCents += cents;
        history.add(new Transaction("deposit", cents));
    }

    public void withdraw(long cents) {
        if (cents > balanceCents) {
            throw new IllegalStateException("insufficient funds");
        }
        balanceCents -= cents;
        history.add(new Transaction("withdraw", -cents));
    }

    public double balance() {
        return balanceCents / 100.0;
    }

    public static void main(String[] args) {
        BankAccount account = new BankAccount("Jordan Rivera", 10_000);
        account.deposit(2_500);
        account.withdraw(1_200);
        System.out.printf("%s: $%.2f over %d transactions%n",
                account.owner, account.balance(), account.history.size());
    }
}
