package trismegistoplanilla.mysqldao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.json.JSONArray;
import org.json.JSONObject;
import trismegistoplanilla.beans.AreaBean;
import trismegistoplanilla.beans.CargoBean;
import trismegistoplanilla.dao.CargoDAO;
import trismegistoplanilla.utilities.ResponseHelper;
import trismegistoplanilla.utilities.Variables;

public class CargoMysqlDAO implements CargoDAO {

	@Override
	public JSONObject listarCargo(AreaBean a) {
		System.out.println("CargoMysqlDAO: listarCargo");
		JSONObject JOListarCargo = null;
		JSONArray JArrayCargo = new JSONArray();
		ResponseHelper response = new ResponseHelper();

		String sql = "SELECT "
			+ "	area_cargo.codigo_cargo codigoCargo, "
			+ "	cargo.descargo nombre "
			+ "FROM "
			+ "	area_cargo "
			+ "INNER JOIN cargo ON cargo.codigo_cargo = area_cargo.codigo_cargo "
			+ "WHERE "
			+ "	area_cargo.estado_registro = 1 "
			+ "AND area_cargo.codigo_area = ?";

		Connection conexion = null;
		PreparedStatement ps = null;
		ResultSet rs = null;

		try {
			conexion = MysqlDAOFactory.obtenerConexion(Variables.MYSQL_NUEVO_BD_NAME);
			ps = conexion.prepareStatement(sql);
			ps.setInt(1, a.getCodigoArea());
			rs = ps.executeQuery();
			while (rs.next()) {
				CargoBean c = new CargoBean();
				c.setCodigoCargo(rs.getInt("codigoCargo"));
				c.setNombre(rs.getString("nombre"));
				JSONObject objCargo = new JSONObject(c);
				JArrayCargo.put(objCargo);
			}
			JSONObject objCargo = new JSONObject();
			objCargo.put("cargos", JArrayCargo);
			response.setStatus(true);
			response.setMessage("Los cargos se listaron correctamente");
			response.setData(objCargo);
		} catch (SQLException e) {
			e.printStackTrace();
			response.setStatus(false);
			response.setMessage("Error: " + e.getMessage() + "   Error Code: [" + e.getErrorCode() + "]");
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}
				if (ps != null) {
					ps.close();
				}
				if (conexion != null) {
					conexion.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		JOListarCargo = new JSONObject(response);
		return JOListarCargo;
	}

	@Override
	public JSONObject validarExistenciaCargo(AreaBean a, CargoBean c) {
		System.out.println("CargoMysqlDAO: validarExistenciaCargo");
		JSONObject JOValidarExistenciaCargo = null;
		ResponseHelper response = new ResponseHelper();
		String sql = ""
			+ "select "
			+ "count(1) existeCargo "
			+ "from area_cargo "
			+ "where area_cargo.estado_registro = 1 and area_cargo.codigo_area = ? and area_cargo.codigo_cargo = ?";
		Connection conexion = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			conexion = MysqlDAOFactory.obtenerConexion(Variables.MYSQL_NUEVO_BD_NAME);
			ps = conexion.prepareStatement(sql);
			ps.setInt(1, a.getCodigoArea());
			ps.setInt(2, c.getCodigoCargo());
			rs = ps.executeQuery();
			rs.next();
			int existeCargo = 0;
			existeCargo = rs.getInt("existeCargo");
			if (existeCargo > 0) {
				response.setStatus(true);
				response.setMessage("El cargo seleccionada existe");
			} else {
				response.setStatus(false);
				response.setMessage("Error! El cargo seleccionada no existe");
			}
		} catch (SQLException e) {
			e.printStackTrace();
			response.setStatus(false);
			response.setMessage("Error: " + e.getMessage() + "   Error Code: [" + e.getErrorCode() + "]");
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}
				if (ps != null) {
					ps.close();
				}
				if (conexion != null) {
					conexion.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		JOValidarExistenciaCargo = new JSONObject(response);
		return JOValidarExistenciaCargo;
	}

	@Override
	public JSONObject registrar(JSONObject datos) {
		System.out.println("CargoMysqlDAO: registrar");
		JSONObject jObject = null;
		ResponseHelper response = new ResponseHelper();
		Connection cnx = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		String sql = "insert into cargo (nombre, estado_registro) values (?, 1)";
		int resultado;
		try {
			cnx = MysqlDAOFactory.obtenerConexion(Variables.MYSQL_NUEVO_BD_NAME);
			cnx.setAutoCommit(false);
			ps = cnx.prepareStatement(sql);
			ps.setString(1, datos.getString("cargo"));
			resultado = ps.executeUpdate();
			if (resultado == 1) {
				cnx.commit();
				response.setStatus(true);
				response.setMessage("Se registró el cargo correctamente!");
			} else {
				cnx.rollback();
				response.setStatus(false);
				response.setMessage("No se pudo registrar el cargo.");
			}
		} catch (SQLException e) {
			e.printStackTrace();
			response.setStatus(false);
			response.setMessage("Error: " + e.getMessage() + "   Error Code: [" + e.getErrorCode() + "]");
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}
				if (ps != null) {
					ps.close();
				}
				if (cnx != null) {
					cnx.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

		jObject = new JSONObject(response);
		return jObject;
	}

	@Override
	public JSONObject editar(JSONObject datos) {
		System.out.println("CargoMysqlDAO: editar");
		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
	}

	@Override
	public JSONObject estado(JSONObject datos) {
		System.out.println("CargoMysqlDAO: estado");
		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
	}

	@Override
	public JSONObject validarNombreAdd(JSONObject datos) {
		System.out.println("CargoMysqlDAO: validarNombreAdd");
		JSONObject jObject;
		ResponseHelper response = new ResponseHelper();
		Connection cnx = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		String sql = "select count(1) cantidad "
			+ "FROM cargo "
			+ "where cargo.nombre = ?";
		int resultado;
		try {
			cnx = MysqlDAOFactory.obtenerConexion(Variables.MYSQL_NUEVO_BD_NAME);
			ps = cnx.prepareStatement(sql);
			ps.setString(1, datos.getString("cargo"));
			rs = ps.executeQuery();
			if (rs.next()) {
				resultado = rs.getInt("cantidad");
				if (resultado == 1) {
					response.setStatus(false);
					response.setMessage("Ya existe un cargo con ese nombre");
				} else {
					response.setStatus(true);
					response.setMessage("Puede proceder a registrar el cargo");
				}
			} else {
				response.setStatus(false);
				response.setMessage("No se pudo encontrar el cargo");
			}
		} catch (SQLException e) {
			e.printStackTrace();
			response.setStatus(false);
			response.setMessage("Error: " + e.getMessage() + "   Error Code: [" + e.getErrorCode() + "]");
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}
				if (ps != null) {
					ps.close();
				}
				if (cnx != null) {
					cnx.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

		jObject = new JSONObject(response);
		return jObject;
	}

	@Override
	public JSONObject validarNombreEdit(JSONObject datos) {
		System.out.println("CargoMysqlDAO: validarNombreEdit");
		JSONObject jObject;
		ResponseHelper response = new ResponseHelper();
		Connection cnx = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		String sql = "select count(1) "
			+ "FROM area "
			+ "where cargo.nombre = ? "
			+ "and cargo.codigo_cargo not in (?)";
		int resultado;
		try {
			cnx = MysqlDAOFactory.obtenerConexion(Variables.MYSQL_NUEVO_BD_NAME);
			ps = cnx.prepareStatement(sql);
			ps.setString(1, datos.getString("cargo"));
			ps.setInt(2, datos.getInt("codigoCargo"));
			rs = ps.executeQuery();
			if (rs.next()) {
				resultado = rs.getInt("cantidad");
				if (resultado == 1) {
					response.setStatus(false);
					response.setMessage("Ya existe un cargo con ese nombre");
				} else {
					response.setStatus(true);
					response.setMessage("Puede proceder a actualizar el cargo");
				}
			} else {
				response.setStatus(false);
				response.setMessage("No se pudo encontrar el cargo");
			}
		} catch (SQLException e) {
			e.printStackTrace();
			response.setStatus(false);
			response.setMessage("Error: " + e.getMessage() + "   Error Code: [" + e.getErrorCode() + "]");
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}
				if (ps != null) {
					ps.close();
				}
				if (cnx != null) {
					cnx.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

		jObject = new JSONObject(response);
		return jObject;
	}

}