package dao;

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

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

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

import util.DBConexao;
import util.DBConfig;
import business.PreencheUsuario;
import business.Usuario;

public class UsuarioDaoTestCase {

	UsuarioDAO usuarioDAO = null;

	static Usuario usuario1 = PreencheUsuario.getUsuario1();
	static Usuario usuario2 = PreencheUsuario.getUsuario2();

	private void compare(Usuario usuarioEsperado, Usuario usuarioLido) {
		assertEquals(usuarioEsperado.getId(), usuarioLido.getId());
		assertEquals(usuarioEsperado.getIdPessoa(), usuarioLido.getIdPessoa());
		assertEquals(usuarioEsperado.getPerfil(), usuarioLido.getPerfil());
		assertEquals(usuarioEsperado.getSenha(), usuarioLido.getSenha());
		assertEquals(usuarioEsperado.getUserId(), usuarioLido.getUserId());
	}

	@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);
		
		usuarioDAO = DAOTstFactory.getUsuarioDAO(db);
	}

	@Test
	public void testInserir() throws ClassNotFoundException, SQLException {
		assertTrue(usuario1.getId() < 0);
		assertTrue(usuario2.getId() < 0);
		
		List<Usuario> lista = usuarioDAO.listarNaoAssociados();
		int count = verificarUsuariosCadastrados(lista);
		assertEquals(0, count);

		usuarioDAO.inserir(usuario1);
		usuarioDAO.inserir(usuario2);
	}

	@Test
	public void testListar() throws ClassNotFoundException, SQLException {
		assertTrue(usuario1.getId() < 0);
		assertTrue(usuario2.getId() < 0);
		
		List<Usuario> lista = usuarioDAO.listar();
		int count = verificarUsuariosCadastrados(lista);
		assertEquals(2, count);
	}

	@Test
	public void testListarNaoAssociados() throws ClassNotFoundException,
			SQLException {
		assertFalse(usuario1.getId() < 0);
		assertFalse(usuario2.getId() < 0);
		
		usuario1.setPerfil("-");
		usuario2.setPerfil("-");
		List<Usuario> lista = usuarioDAO.listarNaoAssociados();
		int count = verificarUsuariosCadastrados(lista);
		assertEquals(2, count);
	}

	@Test
	public void testExcluir() throws ClassNotFoundException, SQLException {
		assertFalse(usuario1.getId() < 0);
		assertFalse(usuario2.getId() < 0);
		
		usuarioDAO.excluir(usuario1);
		usuarioDAO.excluir(usuario2);

		List<Usuario> lista = usuarioDAO.listarNaoAssociados();
		int count = verificarUsuariosCadastrados(lista);
		assertEquals(0, count);
	}

	private int verificarUsuariosCadastrados(List<Usuario> lista) {
		int count = 0;

		for (Usuario usuario : lista) {
			if (usuario.getUserId().equals(usuario1.getUserId())) {
				if (usuario1.getId() < 0) {
					usuario1.setId(usuario.getId());
					usuario1.setIdPessoa(usuario.getIdPessoa());
				}
				count++;
				compare(usuario1, usuario);
			} else if (usuario.getUserId().equals(usuario2.getUserId())) {
				if (usuario2.getId() < 0) {
					usuario2.setId(usuario.getId());
					usuario2.setIdPessoa(usuario.getIdPessoa());
				}
				count++;
				compare(usuario2, usuario);
			}
		}
		return count;
	}
}
