import static org.junit.jupiter.api.Assertions.assertEquals;

import org.junit.jupiter.api.Test;

// Pruebas públicas de P0. No las modifiquen: sus propias pruebas van en otro *Test.java.
class P0ProductPublicTest {

    @Test
    void constructorKeepsTheData() {
        Product milk = new Product("LEC-01", "Leche evaporada", 420, 24);

        assertEquals("LEC-01", milk.code());
        assertEquals("Leche evaporada", milk.name());
        assertEquals(420, milk.priceCents());
        assertEquals(24, milk.stock());
    }

    @Test
    void addStockIncreasesTheStock() {
        Product bread = new Product("PAN-01", "Pan francés", 30, 40);

        bread.addStock(60);

        assertEquals(100, bread.stock());
    }

    @Test
    void removeStockDecreasesTheStock() {
        Product soda = new Product("GAS-01", "Gaseosa 500 ml", 250, 12);

        soda.removeStock(5);
        soda.removeStock(7);

        assertEquals(0, soda.stock());
    }

    @Test
    void stockValueIsPriceTimesStock() {
        Product rice = new Product("ARR-02", "Arroz superior 5 kg", 2190, 8);

        assertEquals(17_520, rice.stockValueCents());
    }

    @Test
    void stockValueOfAnEmptyProductIsZero() {
        Product oil = new Product("ACE-01", "Aceite vegetal 1 l", 990, 0);

        assertEquals(0, oil.stockValueCents());
    }

    @Test
    void stockValueDoesNotOverflow() {
        // 150 000 céntimos x 20 000 unidades no cabe en un int.
        Product cases = new Product("CER-01", "Cerveza, caja de 12", 150_000, 20_000);

        assertEquals(3_000_000_000L, cases.stockValueCents());
    }

    @Test
    void eachProductHasItsOwnStock() {
        Product a = new Product("HUE-01", "Huevo", 60, 30);
        Product b = new Product("HUE-02", "Huevo de corral", 80, 30);

        a.removeStock(10);

        assertEquals(20, a.stock());
        assertEquals(30, b.stock());
    }
}
