package trismegistoplanilla.sqlserverdao;

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.SedeBean;
import trismegistoplanilla.dao.SedeDAO;
import trismegistoplanilla.utilities.ResponseHelper;
import trismegistoplanilla.utilities.Variables;

public class SedeSqlserverDAO implements SedeDAO {

	@Override
	public JSONObject listarSede() {
		System.out.println("SedeSqlserverDAO: listarSede");
		JSONObject JObjectSede = null;
		JSONArray jArraySede = new JSONArray();
		ResponseHelper response = new ResponseHelper();

		String sql = ""
			+ "select "
			+ "sede_area.codigo_sede codigoSede, "
			+ "sede.nombre nombre, "
			+ "sede.direccion direccion, "
			+ "razon_social.codigo_razon_social codigoRazonSocial, "
			+ "razon_social.abreviatura nombreRazonSocial "
			+ "from sede_area "
			+ "inner join dbo.sede ON dbo.sede.codigo_sede = dbo.sede_area.codigo_sede "
			+ "inner join dbo.razon_social ON dbo.razon_social.codigo_razon_social = dbo.sede.codigo_razon_social "
			+ "where sede_area.estado_registro = 1 and sede.estado_registro = 1 "
			+ "group by sede_area.codigo_sede, sede.nombre, sede.direccion, razon_social.codigo_razon_social, razon_social.abreviatura, sede.estado_registro";
		
		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()) {
				SedeBean s = new SedeBean();
				s.setCodigoSede(rs.getInt("codigoSede"));
				s.setNombre(rs.getString("nombre"));
				s.setDireccion(rs.getString("direccion"));
				s.setCodigoRazonSocial(rs.getInt("codigoRazonSocial"));
				s.setNombreRazonSocial(rs.getString("nombreRazonSocial"));
				JSONObject objSede = new JSONObject(s);
				jArraySede.put(objSede);
			}
			JSONObject objSede = new JSONObject();
			objSede.put("sedes", jArraySede);

			response.setStatus(true);
			response.setMessage("Las sedes se listaron correctamente");
			response.setData(objSede);
		} 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();
			}
		}
		JObjectSede = new JSONObject(response);
		return JObjectSede;
	}

	@Override
	public JSONObject validarExistenciaSede(SedeBean s) {
		System.out.println("SedeSqlserverDAO: validarExistenciaSede");
		JSONObject JObjectValidarExistenciaSede = null;
		ResponseHelper response = new ResponseHelper();

		String sql = ""
			+ "select "
			+ "count(1) existeSede "
			+ "from sede_area "
			+ "where sede_area.estado_registro = 1 and sede_area.codigo_sede = ?";
		
		Connection conexion = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			conexion = SqlserverDAOFactory.obtenerConexion(Variables.BD_NAME);
			ps = conexion.prepareStatement(sql);
			ps.setInt(1, s.getCodigoSede());
			rs = ps.executeQuery();
			rs.next();
			int existeSede = 0;
			existeSede = rs.getInt("existeSede");
			if (existeSede > 0) {
				response.setStatus(true);
				response.setMessage("La sede seleccionada existe");
			} else {
				response.setStatus(false);
				response.setMessage("Error! La sede seleccionada no existe");
			}
		} 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();
			}
		}

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

	@Override
	public JSONObject registrar(JSONObject datos) {
		System.out.println("SedeSqlserverDAO: registrar");
		JSONObject jObject = null;
		ResponseHelper response = new ResponseHelper();
		Connection cnx = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		String sql = ""
			+ "insert into sede (nombre, direccion, codigo_razon_social, 1) "
			+ "values (?, ?, ?, 1)";
		int resultado = 0;
		try {
			cnx = SqlserverDAOFactory.obtenerConexion(Variables.BD_NAME);
			cnx.setAutoCommit(false);
			ps = cnx.prepareStatement(sql);
			int c = 1;
			ps.setString(c++, datos.getString("sede"));
			ps.setString(c++, datos.getString("direccion"));
			ps.setInt(c++, datos.getInt("codigoRazonSocial"));
			resultado = ps.executeUpdate();

			if (resultado == 1) {
				cnx.commit();
				response.setStatus(true);
				response.setMessage("Se registro la sede correctamente!");
			} else {
				cnx.rollback();
				response.setStatus(false);
				response.setMessage("No se puedo registrar la sede");
			}

		} 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 (cnx != null) {
					cnx.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

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

	@Override
	public JSONObject editar(JSONObject datos) {
		System.out.println("SedeSqlserverDAO: 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("SedeSqlserverDAO: 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("SedeSqlserverDAO: validarNombreAdd");
		JSONObject jObject;
		ResponseHelper response = new ResponseHelper();
		Connection cnx = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		String sql = "select count(1) cantidad "
			+ "FROM sede "
			+ "where sede.nombre = ?";
		int resultado;
		try {
			cnx = SqlserverDAOFactory.obtenerConexion(Variables.BD_NAME);
			ps = cnx.prepareStatement(sql);
			ps.setString(1, datos.getString("sede"));
			rs = ps.executeQuery();
			if (rs.next()) {
				resultado = rs.getInt("cantidad");
				if (resultado == 1) {
					response.setStatus(false);
					response.setMessage("Ya existe una sede con ese nombre");
				} else {
					response.setStatus(true);
					response.setMessage("Puede proceder a registrar la sede");
				}
			} else {
				response.setStatus(false);
				response.setMessage("No se pudo encontrar la sede");
			}
		} 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 (cnx != null) {
					cnx.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

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

	@Override
	public JSONObject validarNombreEdit(JSONObject datos) {
		System.out.println("SedeSqlserverDAO: validarNombreEdit");
		JSONObject jObject;
		ResponseHelper response = new ResponseHelper();
		Connection cnx = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		String sql = "select count(1) "
			+ "FROM sede "
			+ "where sede.nombre = ? "
			+ "and sede.codigo_sede not in (?)";
		int resultado;
		try {
			cnx = SqlserverDAOFactory.obtenerConexion(Variables.BD_NAME);
			ps = cnx.prepareStatement(sql);
			ps.setString(1, datos.getString("sede"));
			ps.setInt(2, datos.getInt("codigoSede"));
			rs = ps.executeQuery();
			if (rs.next()) {
				resultado = rs.getInt("cantidad");
				if (resultado == 1) {
					response.setStatus(false);
					response.setMessage("Ya existe una sede con ese nombre");
				} else {
					response.setStatus(true);
					response.setMessage("Puede proceder a actualizar la sede");
				}
			} else {
				response.setStatus(false);
				response.setMessage("No se pudo encontrar la sede");
			}
		} 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 (cnx != null) {
					cnx.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

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

}