package br.com.senacagil.springmvc.dao;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import br.com.senacagil.springmvc.business.Professor;
import br.com.senacagil.springmvc.util.DBConexao;

public class ProfessorDAO {
	private DBConexao db = null;

	private UsuarioDAO usuarioDao = null;

	public ProfessorDAO(UsuarioDAO usuarioDao, DBConexao dbConexao) {
		super();
		this.usuarioDao = usuarioDao;
		this.db = dbConexao;
	}

	public String adicionarProfessor(Professor professor) {
		boolean babou = false;
		String msg = "Professor Cadastrado com Sucesso";

		try {
			// Recupera conexão com o banco
			Connection con = db.getConnection();

			// Cria um statement
			Statement stmt = con.createStatement();

			// Monta base do SQL
			String sql = "SELECT * from professor where matricula =  ";
			sql += professor.getMatricula();

			// Executa o sql
			ResultSet rs = stmt.executeQuery(sql);

			if (rs.next()) {
				babou = true;
				msg = "Matrícula já cadastrada";
			}
			// Termina o statement
			stmt.close();

			if (!babou) {
				// Monta base do SQL
				sql = "INSERT INTO professor(nome,matricula,titulacao) values";

				// Adiciona valores do professor
				sql += "(";
				sql += "'" + professor.getNome() + "'";
				sql += ",";
				sql += "'" + professor.getMatricula() + "'";
				sql += ",";
				sql += "'" + professor.getTitulacao() + "'";

				sql += ")";

				// Cria um statement
				stmt = con.createStatement();

				// Executa o sql
				stmt.executeUpdate(sql);

				// Termina o statement
				stmt.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
			msg = "Erro na execução do SQL. Contacte o Administrador";
		}
		return msg;

	}

	public String removerProfessor(int idProfessor) {
		// Monta base do SQL
		String sql = "DELETE FROM professor WHERE id";
		String msg = null;
		// Adiciona posicao
		sql += "=";
		sql += idProfessor;

		try {
			// Recupera conexão com o banco
			Connection con = db.getConnection();

			// Cria um statement
			Statement stmt = con.createStatement();

			// Executa o sql
			stmt.executeUpdate(sql);

			// Termina o statement
			stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
			msg = "Erro na execução do SQL. Contacte o Administrador";
		}
		return msg;
	}

	public Professor leProfessor(int idProfessor) {
		Professor professor = null;

		// Monta base do SQL
		String sql = "SELECT * FROM professor WHERE id";

		// Adiciona posicao
		sql += "=";
		sql += idProfessor;

		// Recupera conexão com o banco
		Connection con = db.getConnection();

		try {
			// Cria um statement
			Statement stmt = con.createStatement();

			// Executa o sql
			ResultSet rs = stmt.executeQuery(sql);

			// Direciona o ResultSet para o primeiro registro
			if (rs.next()) {
				// Monta o professor
				professor = montaProfessor(rs, usuarioDao);
			}

			// Termina o resultset e o statement
			rs.close();
			stmt.close();

			// Retorna o professor
			return professor;
		} catch (SQLException e) {
			e.printStackTrace();
			return professor;
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			return professor;
		}
	}

	public List<Professor> listarProfessores() {
		// Monta base do SQL
		String sql = "SELECT * FROM professor order by nome";

		try {
			// Recupera conexão com o banco
			Connection con = db.getConnection();

			// Cria um statement
			Statement stmt = con.createStatement();

			// Executa o sql
			ResultSet rs = stmt.executeQuery(sql);

			// Cria objeto de Lista
			List<Professor> professores = new ArrayList<Professor>();

			// Direciona o ResultSet para o primeiro registro
			while (rs.next()) {
				Professor p = montaProfessor(rs, usuarioDao);
				professores.add(p);
			}

			// Termina o resultset e o statement
			rs.close();
			stmt.close();

			// Retorna a lista
			return professores;
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			return null;
		}
	}

	public List<Professor> listarProfessoresPorNome(String nome) {
		// Monta base do SQL
		String sql = "SELECT * FROM professor where nome like '%" + nome + "%'";

		try {
			// Recupera conexão com o banco
			Connection con = db.getConnection();

			// Cria um statement
			Statement stmt = con.createStatement();

			// Executa o sql
			ResultSet rs = stmt.executeQuery(sql);

			// Cria objeto de Lista
			List<Professor> professores = new ArrayList<Professor>();

			// Direciona o ResultSet para o primeiro registro
			while (rs.next()) {
				Professor p = montaProfessor(rs, usuarioDao);
				professores.add(p);
			}

			// Termina o resultset e o statement
			rs.close();
			stmt.close();

			// Retorna a lista
			return professores;
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			return null;
		}
	}

	private Professor montaProfessor(ResultSet rs, UsuarioDAO usuario)
			throws SQLException, ClassNotFoundException {
		int id = rs.getInt("id");
		String nome = rs.getString("nome");
		String matricula = rs.getString("matricula");
		String titulacao = rs.getString("titulacao");

		Professor p = new Professor();

		p.setId(id);
		p.setNome(nome);
		p.setMatricula(matricula);
		p.setTitulacao(titulacao);
		p.setUsuarios(usuario.listarAssociados(p));

		return p;
	}

	public String atualizaProfessor(Professor professor) {
		// Monta base do SQL
		String sql = "UPDATE professor set nome=";
		String msg = null;

		// Adiciona valores do professor

		sql += "'" + professor.getNome() + "'";
		sql += ",matricula=" + professor.getMatricula();
		sql += ",titulacao=";
		sql += "'" + professor.getTitulacao() + "'";

		sql += " where id=" + professor.getId();

		try {
			// Recupera conexão com o banco
			Connection con = db.getConnection();

			// Cria um statement
			Statement stmt = con.createStatement();

			// Executa o sql
			stmt.executeUpdate(sql);

			// Termina o statement
			stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
			msg = "Erro na execução do SQL. Contacte o Administrador";

		}
		return msg;
	}

	public int obtemUltimaMatricula() {
		// Monta base do SQL
		String sql = "SELECT max(matricula) FROM professor";

		// Recupera conexão com o banco
		Connection con = db.getConnection();

		try {
			// Cria um statement
			Statement stmt = con.createStatement();

			// Executa o sql
			ResultSet rs = stmt.executeQuery(sql);

			// Direciona o ResultSet para o primeiro registro
			rs.next();

			// Última matrícula
			int mat = rs.getInt("max");

			// Termina o resultset e o statement
			rs.close();
			stmt.close();

			// Retorna o professor
			return mat;
		} catch (SQLException e) {
			e.printStackTrace();
			return -1;
		}
	}

	public int obtemIdProfComUsername(String username) {
		// Monta base do SQL
		String sql = "SELECT professor.id FROM professor, usuario WHERE professor.id = usuario.id_pessoa and usuario.userid = '"
				+ username + "'";

		// Recupera conexão com o banco
		Connection con = db.getConnection();

		try {
			// Cria um statement
			Statement stmt = con.createStatement();

			// Executa o sql
			ResultSet rs = stmt.executeQuery(sql);

			// Direciona o ResultSet para o primeiro registro
			rs.next();

			// Última matrícula
			int id = rs.getInt("id");

			// Termina o resultset e o statement
			rs.close();
			stmt.close();

			// Retorna o professor
			return id;
		} catch (SQLException e) {
			e.printStackTrace();
			return -1;
		}
	}
}
