package sklep;

import static org.assertj.core.api.Assertions.*;
import static sklep.ConditionTowarNiedrogi.niedrogi;

import java.math.BigDecimal;
import java.util.Collection;

import org.junit.Before;
import org.junit.Test;

public class KatalogTest {
	private static final BigDecimal VAT = new BigDecimal("0.23");
	private static final BigDecimal CENA_NETTO_PRALKI = new BigDecimal("800.00");
	private static final String PRALKA = "Pralka";

	private static final BigDecimal CENA_NETTO_ODKURZACZA = new BigDecimal("200.00");
	private static final String ODKURZACZ = "Odkurzacz";

	private static final BigDecimal ZMIANA = new BigDecimal("0.10");
	private static final BigDecimal ZMIENIONA_CENA_PRALKI = new BigDecimal("880.00");
	private static final BigDecimal ZMIENIONA_CENA_ODKURZACZA = new BigDecimal("220.00");

	private static final String NIEZNANY = "Nieznany";

	Katalog katalog;
	Towar pralka, odkurzacz;
	
	@Before
	public void setUp() {
		pralka = new Towar(13, PRALKA, CENA_NETTO_PRALKI, VAT);
		odkurzacz = new Towar(11, ODKURZACZ, CENA_NETTO_ODKURZACZA, VAT);
		
		katalog = new Katalog();

		katalog.dodaj(pralka);
		katalog.dodaj(odkurzacz);
	}

	@Test
	public void testSzukajWgId() throws NieznanyTowar {
		Towar towar = katalog.szukajWgId(13);
		assertThat(towar).isEqualTo(pralka);
	}

	@Test
	public void testSzukajWgNazwy() throws NieznanyTowar {
		Towar towar = katalog.szukajWgNazwy(ODKURZACZ);
		assertThat(towar).isEqualTo(odkurzacz);
	}
	
	
	@Test
	public void testSzukajWgNazwyNieznany() {
		assertThatThrownBy(() -> {
					katalog.szukajWgNazwy(NIEZNANY);
			})
			.isOfAnyClassIn(NieznanyTowar.class)
			//.hasMessage("Nieznany towar " + NIEZNANY);
			.hasMessageContaining(NIEZNANY);
	}
	
	@Test
	public void testNazwyTowarow() {
		Collection<String> nazwyTowarow = katalog.nazwyTowarow();
		
		assertThat(nazwyTowarow)
			.containsOnly(PRALKA, ODKURZACZ);
	}

	@Test
	public void testUsun1() throws NieznanyTowar {
		katalog.usunTowar(ODKURZACZ);
		assertThat(katalog.nazwyTowarow())
			.doesNotContain(ODKURZACZ)
			.contains(PRALKA);
	}
	
	@Test
	public void testNiedrogi() {
		assertThat(odkurzacz).is(niedrogi());
	}
}
