package dao;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import util.DBConexao;
import business.Mensalidade;

public class MensalidadeDAO {
	private DBConexao db = null;

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

	public String adicionarMensalidade(Mensalidade mensalidade) {
		boolean babou = false;
		String msg = "Mensalidade Registrada 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 mensalidade where id = ";
			sql += mensalidade.getId();

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

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

			if (!babou) {
				// Monta base do SQL
				sql = "INSERT INTO mensalidade(data_parcela, data_pagto, valor, id_aluno) values";

				// Adiciona valores da mensalidade

				sql += "(";
				sql += "'" + mensalidade.getData_parcela() + "'";
				sql += ",";
				sql += "'" + mensalidade.getData_pagto() + "'";
				sql += ",";
				sql += "'" + mensalidade.getValor() + "'";
				sql += ",";
				sql += "'" + mensalidade.getId_aluno() + "'";

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

		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 Mensalidade leMensalidade(int idMensalidade) {
		// Monta base do SQL
		String sql = "SELECT * FROM mensalidade WHERE id";

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

		// 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 o mensalidade
			Mensalidade a = montaMensalidade(rs);

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

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

	public ArrayList<Mensalidade> listarMensalidades(int id_aluno) {
		// Monta base do SQL
		String sql = "SELECT * FROM mensalidade where id_aluno = " + id_aluno;

		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
			ArrayList<Mensalidade> mensalidades = new ArrayList<Mensalidade>();

			// Direciona o ResultSet para o primeiro registro
			while (rs.next()) {
				Mensalidade p = montaMensalidade(rs);
				mensalidades.add(p);
			}

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

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

	public ArrayList<Mensalidade> listarMensalidadesPorData(String nome) {
		// Monta base do SQL
		String sql = "SELECT * FROM mensalidade where data_parcela 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
			ArrayList<Mensalidade> mensalidades = new ArrayList<Mensalidade>();

			// Direciona o ResultSet para o primeiro registro
			while (rs.next()) {
				Mensalidade p = montaMensalidade(rs);
				mensalidades.add(p);
			}

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

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

	private Mensalidade montaMensalidade(ResultSet rs) throws SQLException {
		int id = rs.getInt("id");
		String data_parcela = rs.getString("data_parcela");
		String data_pagto = rs.getString("data_pagto");
		float valor = rs.getFloat("valor");
		int id_aluno = rs.getInt("id_aluno");

		Mensalidade m = new Mensalidade();

		m.setId(id);
		m.setData_parcela(data_parcela);
		m.setData_pagto(data_pagto);
		m.setValor(valor);
		m.setId_aluno(id_aluno);

		return m;
	}

	public String atualizaMensalidade(Mensalidade mensalidade) {
		// Monta base do SQL
		String sql = "UPDATE mensalidade set data_parcela=";
		String msg = "Mensalidade Alterada com Sucesso";

		// Adiciona valores do mensalidade

		sql += "'" + mensalidade.getData_parcela() + "'";
		sql += ",data_pagto='" + mensalidade.getData_pagto() + "'";
		sql += ",valor=" + mensalidade.getValor();
		sql += ",id_aluno=" + mensalidade.getId_aluno();

		sql += " where id=" + mensalidade.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;
	}

	public int obtemUltimaMatricula() {
		// Monta base do SQL
		String sql = "SELECT max(id) FROM mensalidade";

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

			// Última matrícula
			int mat = rs.getInt("max");

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

			// Retorna o mensalidade
			return mat;
		} catch (SQLException e) {
			e.printStackTrace();
			return -1;
		}
	}

	public int obtemIdMensComUsername(String username) {
		// Monta base do SQL
		String sql = "SELECT id FROM mensalidade, usuario WHERE mensalidade.id = usuario.idalun and usuario.userid = '"
				+ username + "'";

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

			// Última matrícula
			int id = rs.getInt("id");

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

			// Retorna a mensalidade
			return id;
		} catch (SQLException e) {
			e.printStackTrace();
			return -1;
		}
	}

	ArrayList<Mensalidade> lista = new ArrayList<Mensalidade>();

	public void inserir(Mensalidade mens) {
		lista.add(mens);
	}

	public boolean removerPorId(String matricula) {
		for (int i = 0; i < lista.size(); i++) {
			Mensalidade mens = (Mensalidade) lista.get(i);

			if (matricula.equals(mens.getId())) {
				lista.remove(mens);
				return true;
			}
		}

		return false;
	}

	public ArrayList<Mensalidade> listar() {
		return lista;
	}
}
