package demojsoncrud.sqlserverdao;

import demojsoncrud.beans.UbigeoBean;
import demojsoncrud.dao.UbigeoDAO;
import demojsoncrud.utilities.ResponseHelper;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.json.JSONArray;
import org.json.JSONObject;

public class UbigeoSqlserverDAO implements UbigeoDAO {

  @Override
  public JSONObject listarDepartamento() {
    JSONObject jsonReturn;
    JSONArray data = new JSONArray();
    PreparedStatement psListarDepartamento = null;
    ResultSet rsListarDepartamento = null;
    Connection connection = null;
    String base = "ubigeo";
    ResponseHelper response = new ResponseHelper();

    try {
      connection = SqlserverDAOFactory.obtenerConexion(base);
      String sql
              = "select "
              + "codigo_departamento as codigoDepartamento, "
              + "nombre_departamento as nombreDepartamento "
              + "from ubigeo "
              + "group by codigo_departamento, nombre_departamento "
              + "order by nombre_departamento";
      psListarDepartamento = connection.prepareStatement(sql);
      rsListarDepartamento = psListarDepartamento.executeQuery();
      while (rsListarDepartamento.next()) {
        UbigeoBean ubigeoBean = new UbigeoBean();
        ubigeoBean.setCodigoDepartamento(rsListarDepartamento.getString("codigoDepartamento"));
        ubigeoBean.setNombreDepartamento(rsListarDepartamento.getString("nombreDepartamento"));
        JSONObject obj = new JSONObject(ubigeoBean);
        data.put(obj);
      }

      JSONObject jsonData = new JSONObject();
      jsonData.put("departamentos", data);

      response.setData(jsonData);
      response.setMessage("Listado correctamente!");
      response.setStatus(true);

    } catch (SQLException e) {
      response.setMessage("Error al listarDepartamento -> " + e.getMessage() + " Error code [" + e.getErrorCode() + "].");
      response.setStatus(false);
      System.err.println("Error al registrar -> " + e.getMessage() + "[" + e.getErrorCode() + "]");
    } finally {
      try {
        if (rsListarDepartamento != null) {
          rsListarDepartamento.close();
        }
        if (psListarDepartamento != null) {
          psListarDepartamento.close();
        }
        if (connection != null) {
          connection.close();
        }
      } catch (SQLException e) {
        System.err.println("Error: ha ocurrido un error al intentar cerrar las conexiones y/o liberacion de recursos -> " + e.getMessage());
      }

    }

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

  @Override
  public JSONObject listarProvincia(JSONObject datos) {
    System.out.println(datos);
    JSONObject jsonReturn;
    JSONArray data = new JSONArray();
    PreparedStatement psListarProvincia = null;
    ResultSet rsListarProvincia = null;
    Connection connection = null;
    String base = "ubigeo";
    ResponseHelper response = new ResponseHelper();

    try {
      connection = SqlserverDAOFactory.obtenerConexion(base);
      String sql
              = "select "
              + "codigo_provincia as codigoProvincia, "
              + "nombre_provincia as nombreProvincia "
              + "from ubigeo "
              + "where codigo_departamento = ? "
              + "group by codigo_provincia, nombre_provincia "
              + "order by nombre_provincia";
      psListarProvincia = connection.prepareStatement(sql);
      psListarProvincia.setInt(1, datos.getInt("codigoDepartamento"));
      rsListarProvincia = psListarProvincia.executeQuery();
      while (rsListarProvincia.next()) {
        UbigeoBean ubigeoBean = new UbigeoBean();
        ubigeoBean.setCodigoProvincia(rsListarProvincia.getString("codigoProvincia"));
        ubigeoBean.setNombreProvincia(rsListarProvincia.getString("nombreProvincia"));
        JSONObject obj = new JSONObject(ubigeoBean);
        data.put(obj);
      }

      JSONObject jsonData = new JSONObject();
      jsonData.put("provincias", data);

      response.setData(jsonData);
      response.setMessage("Listado correctamente!");
      response.setStatus(true);

    } catch (SQLException e) {
      response.setMessage("Error al listarProvincia -> " + e.getMessage() + " Error code [" + e.getErrorCode() + "].");
      response.setStatus(false);
      System.err.println("Error al registrar -> " + e.getMessage() + "[" + e.getErrorCode() + "]");
    } finally {
      try {
        if (rsListarProvincia != null) {
          rsListarProvincia.close();
        }
        if (psListarProvincia != null) {
          psListarProvincia.close();
        }
        if (connection != null) {
          connection.close();
        }
      } catch (SQLException e) {
        System.err.println("Error: ha ocurrido un error al intentar cerrar las conexiones y/o liberacion de recursos -> " + e.getMessage());
      }

    }

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

  @Override
  public JSONObject listarDistrito(JSONObject datos) {
    JSONObject jsonReturn;
    JSONArray data = new JSONArray();
    PreparedStatement psListarDistrito = null;
    ResultSet rsListarDistrito = null;
    Connection connection = null;
    String base = "ubigeo";
    ResponseHelper response = new ResponseHelper();

    try {
      connection = SqlserverDAOFactory.obtenerConexion(base);
      String sql
              = "select "
              + "codigo_distrito as codigoDistrito, "
              + "nombre_distrito as nombreDistrito "
              + "from ubigeo "
              + "where codigo_provincia = ? and codigo_departamento = ? "
              + "order by nombre_distrito";
      psListarDistrito = connection.prepareStatement(sql);
      psListarDistrito.setInt(1, datos.getInt("codigoProvincia"));
      psListarDistrito.setInt(2, datos.getInt("codigoDepartamento"));
      rsListarDistrito = psListarDistrito.executeQuery();
      while (rsListarDistrito.next()) {
        UbigeoBean ubigeoBean = new UbigeoBean();
        ubigeoBean.setCodigoDistrito(rsListarDistrito.getString("codigoDistrito"));
        ubigeoBean.setNombreDistrito(rsListarDistrito.getString("nombreDistrito"));
        JSONObject obj = new JSONObject(ubigeoBean);
        data.put(obj);
      }

      JSONObject jsonData = new JSONObject();
      jsonData.put("distritos", data);

      response.setData(jsonData);
      response.setMessage("Listado correctamente!");
      response.setStatus(true);

    } catch (SQLException e) {
      response.setMessage("Error al listarDistrito -> " + e.getMessage() + " Error code [" + e.getErrorCode() + "].");
      response.setStatus(false);
      System.err.println("Error al registrar -> " + e.getMessage() + "[" + e.getErrorCode() + "]");
    } finally {
      try {
        if (rsListarDistrito != null) {
          rsListarDistrito.close();
        }
        if (psListarDistrito != null) {
          psListarDistrito.close();
        }
        if (connection != null) {
          connection.close();
        }
      } catch (SQLException e) {
        System.err.println("Error: ha ocurrido un error al intentar cerrar las conexiones y/o liberacion de recursos -> " + e.getMessage());
      }
    }

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

}
