package trismegistoplanilla.sqlserverdao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.json.JSONArray;
import org.json.JSONObject;
import trismegistoplanilla.beans.TipoExpedienteBean;
import trismegistoplanilla.dao.TipoExpedienteDAO;
import trismegistoplanilla.utilities.ResponseHelper;
import trismegistoplanilla.utilities.Variables;

public class TipoExpedienteSqlserverDAO implements TipoExpedienteDAO {

	@Override
	public JSONObject listarTipoExpediente() {
		System.out.println("TipoExpedienteSqlserverDAO: listarTipoExpediente");
		JSONObject JOlistarTipoExpediente = null;
		JSONArray JArrayArea = new JSONArray();
		ResponseHelper response = new ResponseHelper();

		String sql = ""
			+ "select "
			+ "codigo_tipo_expediente codigoTipoExpediente, "
			+ "nombre, "
			+ "estado_registro estado "
			+ "from tipo_expediente";
		
		Connection conexion = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			conexion = SqlserverDAOFactory.obtenerConexion(Variables.BD_NAME);
			ps = conexion.prepareStatement(sql);
			rs = ps.executeQuery();
			while (rs.next()) {
				TipoExpedienteBean te = new TipoExpedienteBean();
				te.setCodigoTipoExpediente(rs.getInt("codigoTipoExpediente"));
				te.setNombre(rs.getString("nombre"));
				JSONObject obj = new JSONObject(te);
				JArrayArea.put(obj);
			}
			JSONObject obj = new JSONObject();
			obj.put("tipoexpedientes", JArrayArea);
			response.setStatus(true);
			response.setMessage("Los tipo de expediente se listaron correctamente");
			response.setData(obj);
		} catch (SQLException e) {
			e.printStackTrace();
			response.setStatus(false);
			response.setMessage("Error: " + e.getMessage() + " \n 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();
			}
		}
		JOlistarTipoExpediente = new JSONObject(response);
		return JOlistarTipoExpediente;
	}

	@Override
	public JSONObject registrarTipoExpediente(TipoExpedienteBean te) {
		System.out.println("TipoExpedienteSqlserverDAO: registrarTipoExpediente");
		JSONObject JOregistrarTipoExpediente = null;
		ResponseHelper response = new ResponseHelper();

		String sql = "insert into tipo_expediente (nombre, estado_registro) values (upper(?) ,1)";
		
		Connection conexion = SqlserverDAOFactory.obtenerConexion(Variables.BD_NAME);
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			conexion.setAutoCommit(false);
			// validar existencia de tipo de expediente
			JSONObject validarExistenciaTipoExpediente = validarExistenciaTipoExpediente(te);
			if (validarExistenciaTipoExpediente.getBoolean("status")) {
				response.setStatus(false);
				response.setMessage("El tipo de expediente ingresado, ya existe en el sistema");
				conexion.rollback();
			} else {
				ps = conexion.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
				ps.setString(1, te.getNombre());
				int resultadoRegistroTipoExpediente = ps.executeUpdate();
				if (resultadoRegistroTipoExpediente > 0) {
					rs = ps.getGeneratedKeys();
					rs.next();
					int codigoTipoExpediente = rs.getInt(1);
					JSONObject objTipoExpediente = new JSONObject();
					objTipoExpediente.put("id", codigoTipoExpediente);
					objTipoExpediente.put("data", te.getNombre());
					response.setStatus(true);
					response.setMessage("El tipo de expediente ha sido registrado con exito");
					response.setData(objTipoExpediente);
					conexion.commit();
				} else {
					response.setStatus(false);
					response.setMessage("Error: no se pudo registrar el tipo de expediente ingresado");
					conexion.rollback();
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
			response.setStatus(false);
			response.setMessage("Error: " + e.getMessage() + " \n Error Code: [" + e.getErrorCode() + "]");
			try {
				conexion.rollback();
			} catch (SQLException ex) {
				ex.printStackTrace();
			}
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}
				if (ps != null) {
					ps.close();
				}
				if (conexion != null) {
					conexion.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		JOregistrarTipoExpediente = new JSONObject(response);
		return JOregistrarTipoExpediente;
	}

	@Override
	public JSONObject validarExistenciaTipoExpediente(TipoExpedienteBean te) {
		System.out.println("TipoExpedienteSqlserverDAO: validarExistenciaTipoExpediente");
		JSONObject JOvalidarExistenciaTipoExpediente = null;
		ResponseHelper response = new ResponseHelper();

		String sql = "select count(1) existe from tipo_expediente where nombre = upper(?)";
		
		Connection conexion = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			conexion = SqlserverDAOFactory.obtenerConexion(Variables.BD_NAME);
			ps = conexion.prepareStatement(sql);
			ps.setString(1, te.getNombre());
			rs = ps.executeQuery();
			rs.next();
			int existeTipoExpediente = rs.getInt("existe");
			if (existeTipoExpediente > 0) {
				response.setStatus(true);
			} else {
				response.setStatus(false);
			}
		} catch (SQLException e) {
			e.printStackTrace();
			response.setStatus(false);
			response.setMessage("Error: " + e.getMessage() + " \n 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();
			}
		}
		JOvalidarExistenciaTipoExpediente = new JSONObject(response);
		return JOvalidarExistenciaTipoExpediente;
	}

	@Override
	public JSONObject validarTipoExpedienteSeleccionadoByID(JSONArray ja) {
		System.out.println("TipoExpedienteSqlserverDAO: validarTipoExpedienteSeleccionadoByID");
		JSONObject JOvalidarExistenciaTipoExpediente = null;
		ResponseHelper response = new ResponseHelper();

		String sql = ""
			+ "select "
			+ "count(1) existe "
			+ "from tipo_expediente "
			+ "where codigo_tipo_expediente = ?";
		
		Connection conexion = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			conexion = SqlserverDAOFactory.obtenerConexion(Variables.BD_NAME);
			ps = conexion.prepareStatement(sql);
			int existe = 0;
			for (int i = 0; i < ja.length(); i++) {
				JSONObject obj = ja.getJSONObject(i);
				ps.setInt(1, obj.getInt("id"));
				rs = ps.executeQuery();
				rs.next();
				existe = rs.getInt("existe");
				if (existe == 0) {
					break;
				}
			}
			if (existe > 0) {
				response.setStatus(true);
			} else {
				response.setStatus(false);
				response.setMessage("Al parecer ha seleccionado un tipo de expediente que no se encuentra registrardo, por favor seleccione un elemento correcto y vuelva a intentarlo");
			}
		} catch (SQLException e) {
			e.printStackTrace();
			response.setStatus(false);
			response.setMessage("Error: " + e.getMessage() + " \n 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();
			}
		}
		JOvalidarExistenciaTipoExpediente = new JSONObject(response);
		return JOvalidarExistenciaTipoExpediente;
	}

}