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.Aluno;
import br.com.senacagil.springmvc.business.Professor;
import br.com.senacagil.springmvc.util.DBConexao;

public class AlunoDAO {
	List<Aluno> lista = new ArrayList<Aluno>();
	private DBConexao db = null;

	public AlunoDAO(DBConexao dbConexao) {
		super();
		this.db = dbConexao;
	}

	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
			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
			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
			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
			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
			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;
	}
}
