package 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 util.DBUtil;

import business.Aluno;
import business.Professor;

public class AlunoDAO {
	List<Aluno> lista = new ArrayList<Aluno>();
	
	public void inserir(Aluno al)
	{
		lista.add(al);
	}
	
	public boolean removerPorMatricula(String matricula)
	{
		for (int i=0; i<lista.size() ; i++)
		{
			Aluno al = (Aluno)lista.get(i);
			
			if (matricula.equals( al.getMatricula() ))
			{
				lista.remove(al);
				return true;
			}			
		}
		
		return false;		
	}
	
	public List<Aluno> listar()
	{
		return lista;
	}
	
	public String adicionarAluno(Aluno aluno)
	{
		boolean babou = false;
		String msg = "Aluno Cadastrado com Sucesso";
		
		try
		{
			// Recupera conexão com o banco
			DBUtil db = DBUtil.getInstance();
			Connection con = db.getConnection();
			
			// Cria um statement
			Statement stmt = con.createStatement();
			
			// Monta base do SQL
			String sql = "SELECT * from aluno where matricula =  ";
			sql += aluno.getMatricula();

			System.out.println(sql);
			// 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 aluno(nome,matricula) values";
		
				// Adiciona valores do professor
				sql += "(";
				sql += "'"+aluno.getNome()+"'";
				//sql += ",";
				//sql += "'"+aluno.getDataNasc()+"'";
				sql += ",";
				sql += "'"+aluno.getMatricula()+"'";
				
				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 List<Aluno> listarAlunos()
	{
		// Monta base do SQL
		String sql = "SELECT * FROM aluno order by nome";
		
		try
		{
			// Recupera conexão com o banco
			DBUtil db = DBUtil.getInstance();
			Connection con = db.getConnection();
			
			// Cria um statement
			Statement stmt = con.createStatement();
			
			// Executa o sql
			ResultSet rs = stmt.executeQuery(sql);
			
			// Cria objeto de Lista
			List<Aluno> alunos = new ArrayList<Aluno>();
			
			// Direciona o ResultSet para o primeiro registro
			while(rs.next())
			{
				Aluno p = montaAluno(rs);
				alunos.add(p);
			}
			
			// Termina o resultset e o statement
			rs.close();
			stmt.close();
			
			// Retorna a lista
			return alunos;		
		}
		catch(SQLException e)
		{
			e.printStackTrace();
			return null;
		}	
	}
	
	public List<Aluno> listarAlunosPorNome(String nome)
	{
		// Monta base do SQL
		String sql = "SELECT * FROM aluno where nome like '%" + nome + "%'";
		
		try
		{
			// Recupera conexão com o banco
			DBUtil db = DBUtil.getInstance();
			Connection con = db.getConnection();
			
			// Cria um statement
			Statement stmt = con.createStatement();
			
			// Executa o sql
			ResultSet rs = stmt.executeQuery(sql);
			
			// Cria objeto de Lista
			List<Aluno> alunos = new ArrayList<Aluno>();
			
			// Direciona o ResultSet para o primeiro registro
			while(rs.next())
			{
				Aluno p = montaAluno(rs);
				alunos.add(p);
			}
			
			// Termina o resultset e o statement
			rs.close();
			stmt.close();
			
			// Retorna a lista
			return alunos;		
		}
		catch(SQLException e)
		{
			e.printStackTrace();
			return null;
		}	
	}
	private Aluno montaAluno(ResultSet rs) throws SQLException
	{
		int    id		 = rs.getInt("id");
		String nome 	 = rs.getString("nome");
		String matricula = rs.getString("matricula");
		String dataNasc = rs.getString("data_nasc");
		Professor prof = new Professor();
		prof.setId(rs.getInt("prof_resp"));
		
		Aluno a = new Aluno();
		
		a.setId(id);		
		a.setNome(nome);
		a.setMatricula(matricula);
		a.setDataNasc(dataNasc);
		a.setProfessor(prof);
		
		return a;
	}
	public boolean adicionarAlocacao(int idProf, int idAluno)
	{
		// Monta base do SQL
		String sql = "UPDATE aluno set prof_resp =";
		
		// Adiciona valores do aluno
		sql += idProf;
		sql += " where id =";
		sql += idAluno;
		
	    System.out.println("sql"+sql);

		try
		{
			// Recupera conexão com o banco
			DBUtil db = DBUtil.getInstance();
			Connection con = db.getConnection();
			
			// Cria um statement
			Statement stmt = con.createStatement();
			
			// Executa o sql
			stmt.executeUpdate(sql);
			
			// Termina o statement
			stmt.close();
			
			return true;
		}
		catch(SQLException e)
		{
			e.printStackTrace();
			return false;
		}
	}
	
	public String removerAluno(int idAluno)
	{
		// Monta base do SQL
		String sql = "DELETE FROM aluno WHERE id";
		String msg = null;
		
		// Adiciona posicao
		sql += "=";
		sql += idAluno;
		
		try
		{
			// Recupera conexão com o banco
			DBUtil db = DBUtil.getInstance();
			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;
	}
}
