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.DBConexao;
import business.Sala;

public class SalaDAO {
	private DBConexao db = null;

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

	public String adicionarSala(Sala sala) {
		boolean verif = false;
		String msg = "Sala Cadastrada 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 sala where numero =  ";
			sql += sala.getNumero();

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

			if (rs.next()) {
				verif = true;
				msg = "Numero de sala já cadastrada";
			}
			// Termina o statement
			stmt.close();

			if (!verif) {
				// Monta base do SQL
				sql = "INSERT INTO sala(numero,bloco,campus) values";

				// Adiciona valores da sala
				sql += "(";
				sql += "'" + sala.getNumero() + "'";
				sql += ",";
				sql += "'" + sala.getBloco() + "'";
				sql += ",";
				sql += "'" + sala.getCampus() + "'";

				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 removerSala(int idSala) {
		// Monta base do SQL
		String sql = "DELETE FROM sala WHERE id";
		String msg = null;
		// Adiciona posicao
		sql += "=";
		sql += idSala;

		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 void removeSala(int numSala) {
		// Monta base do SQL
		String sql = "DELETE FROM sala WHERE numero";
		// Adiciona posicao
		sql += "=";
		sql += numSala;

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

	public Sala leSala(int idSala) {
		// Monta base do SQL
		String sql = "SELECT * FROM sala WHERE id";

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

		// 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();

			// Monta a sala
			Sala s = montaSala(rs);

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

			// Retorna a sala
			return s;
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		}
	}

	public List<Sala> listarSalas() {
		// Monta base do SQL
		String sql = "SELECT * FROM sala order by numero";

		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<Sala> salas = new ArrayList<Sala>();

			// Direciona o ResultSet para o primeiro registro
			while (rs.next()) {
				Sala s = montaSala(rs);
				salas.add(s);
			}

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

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

	public List<Sala> listarSalasPorNumero(String numero) {
		// Monta base do SQL
		String sql = "SELECT * FROM sala where nome like '%" + numero + "%'";

		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<Sala> salas = new ArrayList<Sala>();

			// Direciona o ResultSet para o primeiro registro
			while (rs.next()) {
				Sala s = montaSala(rs);
				salas.add(s);
			}

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

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

	private Sala montaSala(ResultSet rs) throws SQLException {
		int id = rs.getInt("id");
		String numero = rs.getString("numero");
		String bloco = rs.getString("bloco");
		String campus = rs.getString("campus");

		Sala s = new Sala();

		s.setId(id);
		s.setNumero(numero);
		s.setBloco(bloco);
		s.setCampus(campus);

		return s;
	}

	public String atualizaSala(Sala sala) {
		// Monta base do SQL
		String sql = "UPDATE sala set numero=";
		String msg = null;

		// Adiciona valores do sala

		sql += sala.getNumero();
		sql += ",bloco= '" + sala.getBloco();
		sql += "',campus=";
		sql += "'" + sala.getCampus() + "'";

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

		System.out.println(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();
		} catch (SQLException e) {
			e.printStackTrace();
			msg = "Erro na execução do SQL. Contacte o Administrador";

		}
		return msg;
	}

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

	public void inserir(Sala sl) {
		lista.add(sl);
	}

	public boolean removerPorNumero(String numero) {
		for (int i = 0; i < lista.size(); i++) {
			Sala sl = (Sala) lista.get(i);

			if (numero.equals(sl.getNumero())) {
				lista.remove(sl);
				return true;
			}
		}

		return false;
	}

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