package dao;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;
import java.util.Properties;

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

import util.DBConexao;
import util.DBConfig;
import business.Curso;
import business.PreencheCurso;

public class CursoDaoTestCase {
	Curso curso = new Curso();
	CursoDAO cursoDAO = null;

	static Curso curso1 = PreencheCurso.getCurso1();

	private void compare(Curso cursoEsperado, Curso cursoLido) {
		assertEquals(cursoEsperado.getNome(), cursoLido.getNome());
		assertEquals(cursoEsperado.getGrau(), cursoLido.getGrau());
		assertEquals(cursoEsperado.getCargaHoraria(), cursoLido
				.getCargaHoraria());
	}

	@Before
	public void setUp() {
		Properties properties = new Properties();
		try {
			properties.load(new FileInputStream("./dbconfig.properties"));
		} catch (IOException e) {
			System.out.println("Arquivo de properties não encontrado");
			e.printStackTrace();
			System.exit(1);
		}
		
		DBConfig dbConfig = new DBConfig();
		
		dbConfig.setConfiguracao(properties);
		
		DBConexao db = DBConexao.getInstance(dbConfig);
		
		cursoDAO = DAOTstFactory.getCursoDAO(db);
	}

	@Test
	public void testAdicionarCurso() {
		String msg = cursoDAO.adicionarCurso(curso1);
		assertTrue(msg.contains("Sucesso"));

		msg = cursoDAO.adicionarCurso(curso1);
		assertFalse(msg.contains("Sucesso"));
	}

	@Test
	public void testListarCursos() {
		List<Curso> lista = cursoDAO.listarCursos();

		assertTrue(lista.size() > 0);

		int count = 0;
		for (Curso cursoLido : lista) {
			if (cursoLido.getNome().equals(curso1.getNome())) {
				compare(curso1, cursoLido);
				count++;
			}
		}

		assertTrue(curso1.getId() > 0);
		assertEquals(1, count);
	}

	@Test
	public void testListarCursosPorNome() {
		assertTrue(curso1.getId() > 0);

		String nome = curso1.getNome();
		List<Curso> lista = cursoDAO.listarCursosPorNome(nome);

		for (Curso cursoLido : lista) {
			if (cursoLido.getNome().equals(curso1.getNome())) {
				compare(curso1, cursoLido);
			} else {
				fail("metodo listarCursosPorNome incorreto");
			}
		}
	}

	@Test
	public void testAtualizaCurso() {
		assertTrue(curso1.getId() > 0);

		PreencheCurso.alteraDadosCurso(curso1);
		String msg = cursoDAO.atualizaCurso(curso1);
		assertTrue(msg == null);

		List<Curso> lista = cursoDAO.listarCursos();
		assertEquals(1, lista.size());
	}

	@Test
	public void testRemoverCurso() {
		List<Curso> lista = cursoDAO.listarCursos();
		assertTrue(lista.size() > 0);

		String msg;
		for (Curso cursoLido : lista) {
			msg = cursoDAO.removerCurso(cursoLido.getId());
			assertTrue(msg == null);
		}
	}

}
