package demojsoncrud.sqlserverdao;

import demojsoncrud.beans.PersonaBean;
import demojsoncrud.dao.PersonaDAO;
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 PersonaSqlserverDAO implements PersonaDAO {

  @Override
  public JSONObject listarPersona(JSONObject datos) {
    JSONObject jsonReturn = new JSONObject();
    JSONArray data = new JSONArray();

    PreparedStatement psListarPersona = null, psCantidadPersonas = null;
    ResultSet rsListarPersona = null, rsCantidadPersonas = null;
    Connection connection = null;

    String base = "demojsoncrud";
    String condicion = "";

    int numeroFilas = Integer.parseInt(datos.getString("start")) + 1; //Contador para el numero de filas a listar
    int cantidadPersonas;

    if (!datos.getString("search").equals("")) {
      condicion = " and  (a.nombres like '%" + datos.getString("search") + "%' or a.apellidos like '%" + datos.getString("search") + "%') ";
    }

    try {
      connection = SqlserverDAOFactory.obtenerConexion(base);
      String sql
              = "select top  " + datos.getString("length") + " "
              + "a.codigo, "
              + "a.dni, "
              + "a.apellidos, "
              + "a.nombres, "
              + "a.edad, "
              + "a.correo, "
              + "a.estado "
              + "from persona a "
              + "where a.codigo not in (select top " + datos.getString("start") + " b.codigo from persona b order by 1 desc) "
              + condicion + " "
              + "order by 1 desc";
      System.out.println(sql);
      psListarPersona = connection.prepareStatement(sql);
      rsListarPersona = psListarPersona.executeQuery();

      while (rsListarPersona.next()) {
        PersonaBean personaBean = new PersonaBean();
        int c = 1; //Contador para las columnas
        personaBean.setCodigo(rsListarPersona.getString(c++));
        personaBean.setDni(rsListarPersona.getString(c++));
        personaBean.setApellidos(rsListarPersona.getString(c++));
        personaBean.setNombres(rsListarPersona.getString(c++));
        personaBean.setEdad(rsListarPersona.getString(c++));
        personaBean.setCorreo(rsListarPersona.getString(c++));
        personaBean.setEstado(rsListarPersona.getString(c++));
        JSONObject obj = new JSONObject(personaBean);
        obj.put("item", numeroFilas++);
        data.put(obj);
      }

      String sqlCantidadPersonas = "select count(1) as cantidadPersonas from persona a where a.estado = 1 " + condicion;
      System.out.println(sqlCantidadPersonas);
      psCantidadPersonas = connection.prepareStatement(sqlCantidadPersonas);
      rsCantidadPersonas = psCantidadPersonas.executeQuery();
      rsCantidadPersonas.next();
      cantidadPersonas = rsCantidadPersonas.getInt("cantidadPersonas");

      jsonReturn.put("data", data);
      jsonReturn.put("recordsFiltered", cantidadPersonas);
      jsonReturn.put("recordsTotal", cantidadPersonas);
      jsonReturn.put("draw", datos.getString("draw"));

    } catch (SQLException e) {
      jsonReturn.put("Error", "Error -> " + e.getMessage() + " Error code [" + e.getErrorCode() + "]");
      System.err.println("Error al registrar -> " + e.getMessage() + "[" + e.getErrorCode() + "]");
    } finally {
      try {
        if (rsCantidadPersonas != null) {
          rsCantidadPersonas.close();
        }
        if (rsListarPersona != null) {
          rsListarPersona.close();
        }
        if (psCantidadPersonas != null) {
          psCantidadPersonas.close();
        }
        if (psListarPersona != null) {
          psListarPersona.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());
      }
    }

    return jsonReturn;
  }

  @Override
  public JSONObject registrarPersona(JSONObject datos) {
    JSONObject jsonReturn;
    int resultDni, resultPersona;
    String base = "demojsoncrud";
    PreparedStatement psInsertarPersona = null, psGetDni = null;
    ResultSet rsGetDni = null;
    Connection connection = null;
    ResponseHelper response = new ResponseHelper();
    try {
      connection = SqlserverDAOFactory.obtenerConexion(base);

      String sqlGetDni = "select count(1) dni from persona where dni = ?";
      psGetDni = connection.prepareStatement(sqlGetDni);
      psGetDni.setString(1, datos.getString("dni"));
      rsGetDni = psGetDni.executeQuery();
      rsGetDni.next();
      resultDni = rsGetDni.getInt("dni");

      if (resultDni == 0) {
        String sql
                = "insert into persona (dni, apellidos, nombres, edad, correo, estado) values "
                + "(?,RTRIM(UPPER(?)),RTRIM(UPPER(?)),?,RTRIM(UPPER(?)),1)";
        int c = 1; //contador para las columnas
        psInsertarPersona = connection.prepareStatement(sql);
        psInsertarPersona.setString(c++, datos.getString("dni"));
        psInsertarPersona.setString(c++, datos.getString("apellidos"));
        psInsertarPersona.setString(c++, datos.getString("nombres"));
        psInsertarPersona.setString(c++, datos.getString("edad"));
        psInsertarPersona.setString(c++, datos.getString("correo"));
        resultPersona = psInsertarPersona.executeUpdate();
        if (resultPersona == 1) {
          response.setMessage("Registro correcto!");
          response.setStatus(true);
        } else {
          response.setMessage("No se pudo registrar a la persona");
          response.setStatus(false); // ERROR
        }

      } else {
        response.setMessage("El documento ya existe en mi base de datos. Prueba otro.");
        response.setStatus(false); // DNI REPETIDO
      }

    } catch (SQLException e) {
      response.setStatus(false);
      response.setMessage("Error al registrar -> " + e.getMessage() + "[" + e.getErrorCode() + "]");
      System.err.println("Error al registrar -> " + e.getMessage() + "[" + e.getErrorCode() + "]");
    } finally {
      try {
        if (rsGetDni != null) {
          rsGetDni.close();
        }
        if (psGetDni != null) {
          psGetDni.close();
        }
        if (psInsertarPersona != null) {
          psInsertarPersona.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 editarPersona(JSONObject datos) {
    JSONObject jsonReturn;
    String base = "demojsoncrud";
    Connection connection = null;
    PreparedStatement psEditarPersona = null;
    int resultPersona;
    ResponseHelper response = new ResponseHelper();

    try {
      connection = SqlserverDAOFactory.obtenerConexion(base);
      String sql
              = "update persona "
              + "set apellidos = RTRIM(UPPER(?)), "
              + "nombres = RTRIM(UPPER(?)), "
              + "edad = ?, "
              + "correo = RTRIM(UPPER(?)) "
              + "where codigo = ?";

      psEditarPersona = connection.prepareStatement(sql);
      int q = 1; // CONTADOR PARA LAS COLUMNAS
      psEditarPersona.setString(q++, datos.getString("apellidos"));
      psEditarPersona.setString(q++, datos.getString("nombres"));
      psEditarPersona.setString(q++, datos.getString("edad"));
      psEditarPersona.setString(q++, datos.getString("correo"));
      psEditarPersona.setString(q++, datos.getString("codigo"));
      resultPersona = psEditarPersona.executeUpdate();

      if (resultPersona == 1) {
        response.setMessage("Se actualizo correctamente");
        response.setStatus(true); // ACTUALIZO
      } else {
        response.setMessage("Error al actualizar");
        response.setStatus(false); // ERROR
      }

    } catch (SQLException e) {
      response.setStatus(false);
      response.setMessage("Error al actualizar -> " + e.getMessage() + "[" + e.getErrorCode() + "]");
      System.err.println("Error al registrar -> " + e.getMessage() + "[" + e.getErrorCode() + "]");
    } finally {
      try {
        if (psEditarPersona != null) {
          psEditarPersona.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 cambiarEstado(JSONObject datos) {
    JSONObject jsonReturn;
    String base = "demojsoncrud";
    Connection connection = null;
    PreparedStatement psEditarPersona = null;
    int resultPersona;
    ResponseHelper response = new ResponseHelper();

    try {
      connection = SqlserverDAOFactory.obtenerConexion(base);
      String sql
              = "UPDATE persona "
              + " SET estado = ? "
              + "WHERE codigo = ?;";

      psEditarPersona = connection.prepareStatement(sql);
      psEditarPersona.setString(1, datos.getString("estado").equals("1") ? "0" : "1");
      psEditarPersona.setString(2, datos.getString("codigo"));
      resultPersona = psEditarPersona.executeUpdate();

      if (resultPersona == 1) {
        response.setMessage("Se actualizo correctamente");
        response.setStatus(true); // ACTUALIZO
      } else {
        response.setMessage("Error al actualizar");
        response.setStatus(false); // ERROR
      }

    } catch (SQLException e) {
      response.setStatus(false);
      response.setMessage("Error al actualizar -> " + e.getMessage() + "[" + e.getErrorCode() + "]");
      System.err.println("Error al registrar -> " + e.getMessage() + "[" + e.getErrorCode() + "]");
    } finally {
      try {

        if (psEditarPersona != null) {
          psEditarPersona.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 reportePersona(JSONObject datos) {
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
  }

}
