package cz.muni.fi.rtc.ISImporter.tests;

import static org.junit.Assert.*;

import java.io.Reader;
import java.io.StringReader;
import java.util.HashSet;
import java.util.Set;

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

import cz.muni.fi.rtc.ISImporter.ISPersonImporter;
import cz.muni.fi.rtc.teacherWorkbench.model.ImportedPerson;
import cz.muni.fi.rtc.teacherWorkbench.model.ImportedPersonImpl;

public class ISPersonImporterTest {

	private ISPersonImporter importer;
	
	private ImportedPersonImpl person1;
	private String person1String;
	
	private String morePeopleString;
	
	@Before
	public void setUp() throws Exception {
		importer = new ISPersonImporter();
		person1 = new ImportedPersonImpl();
		person1.setDescription("Batch imported user");
		person1.setFirstName("FirstName");
		person1.setLastName("LastName");
		person1.setEmailAddress("1111@mail.muni.cz");
		person1.setUID("1111");
		person1String = "PA165\t1111\tLastName, FirstName\tz\tFI B-AP BcAP [sem 7, roč 4], PdF B-SPE MA3 [sem 1, roč 1], TE3 [sem 1, roč 1]";
		morePeopleString = "PA165\tdemo222\tVáňa, Jan\tzk\tFI N-AP AP [sem 1, roč 1]\n"
							+ "PA165\tdemo333\tVotýpková, Lucie\tzk\tFI B-AP BcAP [sem 7, roč 4]\n"
							+ "PA165\tdemo444\tVystrčil, Radek\tzk\tFI N-AP AP [sem 1, roč 1]\n"
							+ "PA165\tdemo555\tZajac, Jakub\tzk\tFI B-IN GRA [sem 3, roč 2]\n"
							+ "PA165\tdemo666\tZaťko, Juraj\tzk\tPřF B-GE SPRG [sem 1, roč 1]\n"
							+ "PA165\tdemo777\tŽupka, Pavel\tzk\tFI N-AP AP [sem 3, roč 2]\n";
		
		
	}

	@Test
	public void testParseCSVOnePerson() {	
		Set expected = new HashSet();
		expected.add(person1);
		
		Reader reader = new StringReader(person1String);
		
		importer.setReader(reader);
		Set result = importer.getPeople();
		assertTrue("The result does not contain person " + person1, result.contains(person1));
		
		assertEquals(1, result.size());
		
		assertArrayEquals(expected.toArray(), result.toArray());
		
		for(ImportedPerson onlyPerson: result) {
			assertEquals(onlyPerson.getFirstName(), person1.getFirstName());
			assertEquals(onlyPerson.getLastName(), person1.getLastName());
			assertEquals(onlyPerson.getDescription(), person1.getDescription());
			assertEquals(onlyPerson.getEmailAddress(), person1.getEmailAddress());
			assertEquals(onlyPerson.getUID(), person1.getUID());
		}
	}
	

	@Test
	public void testGeneratePasswords() {
		Reader reader = new StringReader(morePeopleString);
		importer.setReader(reader);
		Set result = importer.getPeople();
		
		for(ImportedPerson person: result) {
			assertTrue(person.getRawPassword().length() > 0);
		}
	}
	
	@Test
	public void testMorePeople() {
		Reader reader = new StringReader(morePeopleString);
		importer.setReader(reader);
		Set result = importer.getPeople();
		
		assertEquals(6, result.size());
		
	}

}