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.Curso;

/**
 * 
 * @author Carine
 */
public class CursoDAO {

	/** Método para adicionar um curso */
	public String adicionarCurso(Curso curso) {
		boolean babou = false;
		String msg = "Curso Cadastrado com Sucesso";

		try {
			// Recupera conexao 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 curso where nome =  '"
					+ curso.getNome() + "'";

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

			if (rs.next()) {
				babou = true;
				msg = "Curso já cadastrado";
			}
			// Termina o statement
			stmt.close();

			if (!babou) {
				// Monta base do SQL
				sql = "INSERT INTO curso(nome,grau,carga_horaria) values";

				// Adiciona valores do Curso
				sql += "(";
				sql += "'" + curso.getNome() + "'";
				sql += ",";
				sql += "'" + curso.getGrau() + "'";
				sql += ",";
				sql += "'" + curso.getCargaHoraria() + "'";

				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;

	}

	/** Método para associar um curso a um Aluno */
	public String cursoAssociarAluno(Curso cl) {
		String sql = "INSERT INTO curso_aluno (id_curso, id_aluno) values ("
				+ cl.getId() + "," + cl.getIdAluno() + ")";
		String msg = "Associacao Cadastrada com Sucesso";

		System.out.println(sql);
		try {
			// Recupera conexao 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 execucao do SQL. Contacte o Administrador";
		}
		return msg;
	}

	/** Método para remover um curso */
	public String removerCurso(int idCurso) {
		// Monta base do SQL
		String sql = "DELETE FROM curso WHERE id";
		String msg = null;
		// Adiciona posicao
		sql += "=";
		sql += idCurso;

		try {
			// Recupera conexao 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;
	}

	/** Método para carregar as informações de um curso pelo id */
	public Curso leCurso(int idCurso) {
		// Monta base do SQL
		String sql = "SELECT * FROM curso WHERE id";

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

		// Recupera conexao com o banco
		DBUtil db = DBUtil.getInstance();
		Connection con = db.getConnection();

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

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

			Curso a = null;
			
			// Direciona o ResultSet para o primeiro registro
			if (rs.next()) {

				// Monta o curso
				a = montaCurso(rs);
			}
			// Termina o resultset e o statement
			rs.close();
			stmt.close();

			// Retorna o curso
			return a;
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		}
	}

	/** Método para listar as informações de um curso pelo nome */
	public List<Curso> listarCursos() {
		// Monta base do SQL
		String sql = "SELECT * FROM curso order by nome";

		try {
			// Recupera conexao 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<Curso> cursos = new ArrayList<Curso>();

			// Direciona o ResultSet para o primeiro registro
			if (!rs.isAfterLast()) {
				while (rs.next()) {
					Curso p = montaCurso(rs);
					cursos.add(p);
				}
			}

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

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

	/** Método para listar um curso através de seu nome */
	public List<Curso> listarCursosPorNome(String nome) {
		// Monta base do SQL
		String sql = "SELECT * FROM curso where nome like '%" + nome + "%'";

		try {
			// Recupera conexao 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<Curso> cursos = new ArrayList<Curso>();

			// Direciona o ResultSet para o primeiro registro
			while (rs.next()) {
				Curso p = montaCurso(rs);
				cursos.add(p);
			}

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

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

	/** Método para carregar as informações de um curso em um objeto */
	private Curso montaCurso(ResultSet rs) throws SQLException {
		int id = rs.getInt("id");
		String nome = rs.getString("nome");
		String grau = rs.getString("grau");
		int cargaHoraria = rs.getInt("carga_horaria");

		Curso c = new Curso();

		c.setId(id);
		c.setNome(nome);
		c.setGrau(grau);
		c.setCargaHoraria(cargaHoraria);

		return c;
	}

	/** Método para atualizar um curso no banco */
	public String atualizaCurso(Curso curso) {
		// Monta base do SQL
		String sql = "UPDATE curso set nome=";
		String msg = null;

		// Adiciona valores do curso

		sql += "'" + curso.getNome() + "'";
		sql += ",grau=";
		sql += "'" + curso.getGrau() + "'";
		sql += ",carga_horaria=";
		sql += "'" + curso.getCargaHoraria() + "'";

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

		System.out.println(sql);
		try {
			// Recupera conexao 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 execucao do SQL. Contacte o Administrador";

		}
		return msg;
	}

	List<Curso> lista = new ArrayList<Curso>();

	public void inserir(Curso cl) {
		lista.add(cl);
	}

	public boolean removerPorNome(String nome) {
		for (int i = 0; i < lista.size(); i++) {
			Curso pl = (Curso) lista.get(i);

			if (nome.equals(pl.getNome())) {
				lista.remove(pl);
				return true;
			}
		}

		return false;
	}

	public List<Curso> listar() {
		return lista;
	}
}
