package bank;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;

import org.junit.jupiter.api.Test;

// Cada prueba comprueba un comportamiento y su nombre dice qué se espera.
class BankAccountTest {

    @Test
    void newAccountStartsAtZero() {
        BankAccount account = new BankAccount("Alice");

        assertEquals(0, account.balance());
    }

    @Test
    void depositIncreasesBalance() {
        // Preparar
        BankAccount account = new BankAccount("Alice");

        // Actuar
        account.deposit(10_000);

        // Verificar
        assertEquals(10_000, account.balance());
    }

    @Test
    void withdrawWithEnoughBalance() {
        BankAccount account = new BankAccount("Alice");
        account.deposit(10_000);

        boolean ok = account.withdraw(2_500);

        assertTrue(ok);
        assertEquals(7_500, account.balance());
    }

    @Test
    void withdrawMoreThanBalanceChangesNothing() {
        BankAccount account = new BankAccount("Alice");
        account.deposit(1_000);

        boolean ok = account.withdraw(2_500);

        assertFalse(ok);
        assertEquals(1_000, account.balance());
    }

    @Test
    void rejectsNegativeDeposit() {
        BankAccount account = new BankAccount("Alice");

        assertThrows(IllegalArgumentException.class, () -> account.deposit(-500));
        assertEquals(0, account.balance());
    }

    @Test
    void rejectsZeroWithdrawal() {
        BankAccount account = new BankAccount("Alice");

        assertThrows(IllegalArgumentException.class, () -> account.withdraw(0));
    }

    @Test
    void rejectsBlankOwner() {
        assertThrows(IllegalArgumentException.class, () -> new BankAccount("  "));
    }

    @Test
    void eachAccountGetsADifferentId() {
        BankAccount a = new BankAccount("Alice");
        BankAccount b = new BankAccount("Bob");

        assertNotEquals(a.id(), b.id());
    }
}
