package br.dsc.upe.poli.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;

import br.dsc.upe.poli.banco.ConexaoFactory;
import br.dsc.upe.poli.basicas.Atividade;

public class AtividadeDAO {

	private Connection connection;

	public AtividadeDAO() throws ClassNotFoundException, SQLException {
		this.connection = new ConexaoFactory().getConexao();
	}

	public void cadastrar(Atividade atividade) throws SQLException {
		PreparedStatement stmt;
		stmt = connection
				.prepareStatement("INSERT INTO ATIVIDADES_TABLE (nome_atividade, assuntoRelacionado, recurso,nivel,assunto) VALUES (?,?,?,?,?)");
		stmt.setString(1, atividade.getNomeAtividade());
		stmt.setString(2, atividade.getTopicoPrincipal());
		stmt.setString(3, atividade.getRecurso());
		stmt.setInt(4, atividade.getNivel());
		stmt.setString(5, atividade.getAssunto());
		stmt.execute();
		stmt.close();

		HashMap<String, String> perguntas_repostas = new HashMap<String, String>();
		perguntas_repostas = atividade.getPerguntas_respostas();
		Iterator<String> iterator = perguntas_repostas.keySet().iterator();
		PreparedStatement stmt1;
		while (iterator.hasNext()) {
			String pergunta = (String) iterator.next();
			stmt1 = connection
					.prepareStatement("INSERT INTO resposta_Esperada (atividade, pergunta, resposta) VALUES (?,?,?)");
			stmt1.setString(1, atividade.getNomeAtividade());
			stmt1.setString(2, pergunta);
			stmt1.setString(3, perguntas_repostas.get(pergunta));
			stmt1.execute();
			stmt1.close();
		}

	}

	public void atualizar(Atividade atividade) throws SQLException {
		PreparedStatement stmt;
		stmt = connection
				.prepareStatement("UPDATE ATIVIDADES_TABLE SET nome_atividade = ? ,  assuntoRelacionado = ? , recurso = ? WHERE nome_atividade = ?");
		stmt.setString(1, atividade.getNomeAtividade());
		stmt.setString(2, atividade.getTopicoPrincipal());
		stmt.setString(3, atividade.getRecurso());
		stmt.setString(4, atividade.getNomeAtividade());

		stmt.executeUpdate();
		stmt.close();

	}

	/**
	 * 
	 * @param assuntoRelacionado
	 *            String - assunto relacionado
	 * @return ArrayList<Atividade>
	 * @throws SQLException
	 *             Retorna todas as atividades que estão relacionadas ao assunto
	 *             buscado.
	 */

	public HashMap<String, ArrayList<Atividade>> buscar(
			String assuntoRelacionado, String nome) throws SQLException {
		PreparedStatement stmt;
		ArrayList<Atividade> atividades = new ArrayList<Atividade>();
		HashMap<String, ArrayList<Atividade>> ats = new HashMap<String, ArrayList<Atividade>>();
		stmt = connection
				.prepareStatement("Select * from atividades_table where assuntoRelacionado = ? OR nome_atividade like \' "
						+ nome + "% \'");
		stmt.setString(1, assuntoRelacionado);
		ResultSet rs = stmt.executeQuery();
		int i = 0;
		while (rs.next()) {
			Atividade atividade = new Atividade(rs.getString("nome_atividade"),
					rs.getString("assuntorelacionado"), rs.getString("recurso"));
			atividades.add(atividade);
		}
		ats.put("ATIV", atividades);
		return ats;
	}

	public ArrayList<Atividade> buscarLista(String assuntoRelacionado,
			String nome) throws SQLException {
		PreparedStatement stmt;
		ArrayList<Atividade> atividades = new ArrayList<Atividade>();
		stmt = connection
				.prepareStatement("Select * from atividades_table where assuntoRelacionado = ? OR nome_atividade like \' "
						+ nome + "% \'");
		stmt.setString(1, assuntoRelacionado);
		ResultSet rs = stmt.executeQuery();
		int i = 0;
		while (rs.next()) {
			Atividade atividade = new Atividade(rs.getString("nome_atividade"),
					rs.getString("assuntorelacionado"), rs.getString("recurso"));
			atividades.add(atividade);
		}
		return atividades;
	}

	public Atividade buscarC(String assuntoRelacionado, String nome)
			throws SQLException {
		PreparedStatement stmt;

		stmt = connection
				.prepareStatement("Select * from atividades_table where assuntoRelacionado = ? OR nome_atividade like \' "
						+ nome + "% \'");
		stmt.setString(1, assuntoRelacionado);
		ResultSet rs = stmt.executeQuery();
		Atividade atividade = new Atividade();
		while (rs.next()) {
			atividade.setNomeAtividade(rs.getString("nome_atividade"));
			atividade.setAssuntoRelacionado(rs.getString("assuntorelacionado"));

			atividade.setRecurso(rs.getString("recurso"));

		}
		return atividade;
	}

	public void cadastraAtividadeInicial(String login,
			ArrayList<String> assuntos) throws SQLException {

		PreparedStatement stmt;
		HashMap<String, ArrayList<Atividade>> atRelac = new HashMap<String, ArrayList<Atividade>>();
		int i = 0;
		for (String assunto : assuntos) {

			stmt = connection
					.prepareStatement("Select nome_atividade from atividades_table where assuntoRelacionado = ? ");
			stmt.setString(1, assunto);
			ResultSet rs = stmt.executeQuery();

			while (rs.next()) {
				associarAtividade(login, rs.getString("nome_atividade"));

			}

		}

	}

	public ArrayList<String> listarAtividadesPorLogin(String login)
			throws SQLException {

		PreparedStatement stmt;
		ArrayList<String> atividades = new ArrayList<String>();

		stmt = connection
				.prepareStatement("Select * from atividades_aluno where login = ? ");
		stmt.setString(1, login);
		ResultSet rs = stmt.executeQuery();

		while (rs.next()) {
			atividades.add(rs.getString("atividade"));
		}

		return atividades;

	}

	public HashMap<String,String> getRespostaAtividade(String nomeAtividade)
			throws SQLException {

		PreparedStatement stmt;
		HashMap<String,String> perguntas_respostas = new HashMap<String,String>();

		stmt = connection
				.prepareStatement("Select pergunta, resposta from resposta_esperada where atividade = ? ");
		stmt.setString(1, nomeAtividade);
		ResultSet rs = stmt.executeQuery();

		while (rs.next()) {
			perguntas_respostas.put(rs.getString("pergunta"),rs.getString("resposta"));
		}

		return perguntas_respostas;

	}

	public HashMap<String, ArrayList<Atividade>> listarAtividades(String login,
			ArrayList<String> nomes) throws SQLException {

		PreparedStatement stmt;
		HashMap<String, ArrayList<Atividade>> atRelac = new HashMap<String, ArrayList<Atividade>>();
		ArrayList<Atividade> atividades = new ArrayList<Atividade>();
		int i = 0;
		for (String nome : nomes) {

			stmt = connection
					.prepareStatement("Select * from atividades_table where nome_atividade = ? ");
			stmt.setString(1, nome);
			ResultSet rs = stmt.executeQuery();

			while (rs.next()) {
				Atividade atividade = new Atividade(rs
						.getString("nome_atividade"), rs
						.getString("assuntorelacionado"), rs
						.getString("recurso"));
				atividades.add(atividade);

			}

		}
		atRelac.put("ATIV", atividades);
		return atRelac;

	}

	public void associarAtividade(String login, String nomeAtividade)
			throws SQLException {
		PreparedStatement stmt;
		stmt = connection
				.prepareStatement("INSERT INTO ATIVIDADES_ALUNO (login,atividade) VALUES (?,?)");
		stmt.setString(1, login);
		stmt.setString(2, nomeAtividade);
		stmt.execute();
		stmt.close();

	}

	public boolean existeAtividade(String login, String nomeAtividade)
			throws SQLException {
		boolean flag = false;
		PreparedStatement stmt;
		stmt = connection
				.prepareStatement("Select * from ATIVIDADES_ALUNO where login = ? AND  atividade = ?");
		stmt.setString(1, login);
		stmt.setString(2, nomeAtividade);
		ResultSet rs = stmt.executeQuery();
		while (rs.next()) {
			flag = true;
		}

		stmt.execute();
		stmt.close();
		return flag;
	}

	public Atividade buscarAtividadePorNome(String nome) throws SQLException {
		PreparedStatement stmt;
		stmt = connection
				.prepareStatement("Select * from atividades_table where nome_atividade = ?");
		stmt.setString(1, nome);

		ResultSet rs = stmt.executeQuery();
		Atividade atividade = new Atividade();
		while (rs.next()) {
			atividade.setNomeAtividade(rs.getString("nome_atividade"));
			atividade.setAssuntoRelacionado(rs.getString("assuntorelacionado"));
			atividade.setRecurso(rs.getString("recurso"));
		}

		return atividade;
	}

}
