package bank;

/**
 * Una cuenta bancaria. Invariante: el saldo nunca es negativo.
 * Los montos van en céntimos, como enteros, para no perder precisión.
 */
public class BankAccount {
    private static int accountsOpened = 0;      // de la clase: uno solo para todas las cuentas

    private final String id;
    private final String owner;
    private long balance;                       // céntimos; siempre >= 0

    /** Abre una cuenta con saldo cero. El titular no puede estar vacío. */
    public BankAccount(String owner) {
        if (owner == null || owner.isBlank()) {
            throw new IllegalArgumentException("el titular no puede estar vacío");
        }
        accountsOpened++;
        this.id = String.format("CTA-%04d", accountsOpened);
        this.owner = owner;
        this.balance = 0;
    }

    /** Deposita un monto positivo. */
    public void deposit(long amount) {
        requirePositive(amount);
        balance += amount;
    }

    /**
     * Retira un monto positivo si alcanza el saldo. Devuelve si se pudo; si no
     * alcanza, el saldo no cambia.
     */
    public boolean withdraw(long amount) {
        requirePositive(amount);
        if (amount > balance) {
            return false;
        }
        balance -= amount;
        return true;
    }

    public String id() {
        return id;
    }

    public String owner() {
        return owner;
    }

    public long balance() {
        return balance;
    }

    /** Cuántas cuentas se abrieron desde que arrancó el programa. */
    public static int accountsOpened() {
        return accountsOpened;
    }

    private static void requirePositive(long amount) {
        if (amount <= 0) {
            throw new IllegalArgumentException("el monto debe ser positivo: " + amount);
        }
    }
}
