package pracownicy;

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.*;

import java.io.File;
import java.time.LocalDate;
import java.util.List;

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

// testy odczytu i zapisu pliku z pracownikami - głównie po to, aby pokazać możliwości biblioteki AssertJ

public class ObslugaCSVTest {
	private static final File poprawnyPlik = new File("pracownicy.csv");
	private static final File nowyPlik = new File("plik_testowy.csv");
	private static final Employee KING = new Employee(100, "Steven", "King", "President", 24000,
			LocalDate.of(1987, 6, 17), "Executive", "2004 Charade Rd", "98199", "Seattle", "United States of America");

	@Before
	public void setUp() {
	}

	@Test
	public void testWczytajPlik() {
		// przykład testu napisanego za pomocą prostych asercji JUnit
		List<Employee> lista = ObslugaCSV.wczytajPlik(poprawnyPlik);
		assertNotNull(lista);
		assertFalse("Lista jest pusta", lista.isEmpty());
		assertEquals(107, lista.size());
		
		// to nie jest potrzebne, ale tylko żeby porównać z AssertJ za chwilę:
		for(Employee emp: lista) {
			assertTrue(emp instanceof Employee);
		}
		// ewentualnie zapis "funkcyjny":
		assert lista.stream().allMatch(emp -> emp instanceof Employee);
	}

	@Test
	public void testWczytajPlikAssertJ() {
		// przykład testu napisanego za pomocą asercji AssertJ
		List<Employee> lista = ObslugaCSV.wczytajPlik(poprawnyPlik);
		assertThat(lista).isNotNull()
			.hasSize(107)
			.doesNotContainNull()
			.contains(KING)
			.hasOnlyElementsOfType(Employee.class);
		// fajne? mi się bardzo podoba...
	}
	
	@Test
	public void testZapiszPlikProsty() {
		wyczyscPlikTestowy();
		List<Employee> lista = List.of(KING);
		ObslugaCSV.zapiszPlik(lista, nowyPlik);
		assertThat(nowyPlik).exists();
		wyczyscPlikTestowy();
	}
	
	@Test
	public void testZapiszPlikZlozony() {
		wyczyscPlikTestowy();		
		List<Employee> lista1 = ObslugaCSV.wczytajPlik(poprawnyPlik);
		ObslugaCSV.zapiszPlik(lista1, nowyPlik);
		assertThat(nowyPlik).exists();
		List<Employee> lista2 = ObslugaCSV.wczytajPlik(nowyPlik);
		assertThat(lista2).containsExactlyElementsOf(lista1);
		wyczyscPlikTestowy();
	}

	private void wyczyscPlikTestowy() {
		if(nowyPlik.exists()) {
			nowyPlik.delete(); // usuń gdyby istniał
		}
	}
}
