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.JSONException;
import org.json.JSONObject;

public class PersonaSqlserverDAO implements PersonaDAO {

    @Override
    public JSONObject listarPersonaTest() {

        JSONObject jsonReturn = new JSONObject();
        JSONArray data = new JSONArray();
        ResponseHelper response = new ResponseHelper();
        PreparedStatement psListarPersona = null;
        ResultSet rsListarPersona = null;
        Connection connection = null;
        String base = "demojsoncrud";

        try {
            connection = SqlserverDAOFactory.obtenerConexion(base);
            String sql
                    = "select "
                    + "a.codigo, "
                    + "a.dni, "
                    + "a.apellidos, "
                    + "a.nombres, "
                    + "a.edad, "
                    + "a.correo, "
                    + "a.estado "
                    + "from persona a ";

            psListarPersona = connection.prepareStatement(sql);
            rsListarPersona = psListarPersona.executeQuery();

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

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

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

        } catch (SQLException e) {
            response.setMessage("Error -> " + e.getMessage() + " [" + e.getErrorCode() + "]");
            response.setStatus(false);
        } finally {
            try {
                if (rsListarPersona != null) {
                    rsListarPersona.close();
                }
                if (psListarPersona != null) {
                    psListarPersona.close();
                }
                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException e) {
                response.setMessage("Error -> " + e.getMessage() + " [" + e.getErrorCode() + "]");
                response.setStatus(false);
            }
        }

        jsonReturn = new JSONObject(response);

        return jsonReturn;

    }

    @Override
    public JSONObject listarPersona(String search, String draw, String start, String length) {
        JSONObject jsonReturn = new JSONObject();
        JSONArray data = new JSONArray();

        PreparedStatement psListarPersona = null;
        ResultSet rsListarPersona = null;
        Connection connection = null;

        String base = "demojsoncrud";
        String condicion = "";
        String condiciones = " (a.nombres like '%" + search + "%' or a.apellidos like '%" + search + "%') ";

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

        if (!search.equals("")) {
            condicion = " and " + condiciones;
        }

        try {
            connection = SqlserverDAOFactory.obtenerConexion(base);
            String sql
                    = "select top  " + 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 " + start + " b.codigo from persona b order by 1 desc) "
                    + condicion + " "
                    + "order by 1 desc";

            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);
                data.put(obj);

            }
            if (!search.equals("")) {
                condicion = " where " + condiciones;
            }

            String sqlCantidadPersonas = "select count(1) as cantidadPersonas from persona a " + condicion;

            PreparedStatement psCantidadPersonas = connection.prepareStatement(sqlCantidadPersonas);
            ResultSet rsCantidadPersonas = psCantidadPersonas.executeQuery();
            rsCantidadPersonas.next();
            cantidadPersonas = rsCantidadPersonas.getInt("cantidadPersonas");

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

        } catch (SQLException | JSONException e) {
            jsonReturn.put("Error", "Error -> " + e.getMessage());
        } finally {
            try {
                if (rsListarPersona != null) {
                    rsListarPersona.close();
                }
                if (psListarPersona != null) {
                    psListarPersona.close();
                }
                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException e) {
                jsonReturn.put("Error", "Error inesperado -> " + e.getMessage() + " [" + e.getErrorCode() + "]");
            }
        }

        return jsonReturn;
    }

    @Override
    public JSONObject registrarPersona(PersonaBean bean) {
        JSONObject jsonReturn = new JSONObject();
        int resultDni = 0;
        int resultPersona = 0;
        String base = "demojsoncrud";
        PreparedStatement psInsertarPersona = null;
        Connection connection = null;
        ResponseHelper response = new ResponseHelper();
        try {
            connection = SqlserverDAOFactory.obtenerConexion(base);

            String sqlGetDni = "select count(1) dni from persona where dni = ?";
            PreparedStatement psGetDni = connection.prepareStatement(sqlGetDni);
            psGetDni.setString(1, bean.getDni());
            ResultSet 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++, bean.getDni());
                psInsertarPersona.setString(c++, bean.getApellidos());
                psInsertarPersona.setString(c++, bean.getNombres());
                psInsertarPersona.setString(c++, bean.getEdad());
                psInsertarPersona.setString(c++, bean.getCorreo());
                resultPersona = psInsertarPersona.executeUpdate();
                if (resultPersona == 1) {
                    response.setMessage("Registro correcto!");
                    response.setStatus(true);
                } else {
                    response.setMessage("Error al registrar");
                    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() + "]");
        } finally {
            try {
                if (connection != null) {
                    connection.close();
                }
                if (psInsertarPersona != null) {
                    psInsertarPersona.close();
                }
            } catch (SQLException e) {
                response.setStatus(false);
                response.setMessage("Error al registrar -> " + e.getMessage() + "[" + e.getErrorCode() + "]");
            }
        }

        jsonReturn = new JSONObject(response);

        return jsonReturn;
    }

    @Override
    public JSONObject editarPersona(PersonaBean bean) {
        JSONObject jsonReturn = new JSONObject();
        String base = "demojsoncrud";
        Connection connection = null;
        PreparedStatement psEditarPersona = null;
        int resultPersona = 0;
        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++, bean.getApellidos());
            psEditarPersona.setString(q++, bean.getNombres());
            psEditarPersona.setString(q++, bean.getEdad());
            psEditarPersona.setString(q++, bean.getCorreo());
            psEditarPersona.setString(q++, bean.getCodigo());
            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() + "]");
        } finally {
            try {
                if (connection != null) {
                    connection.close();
                }
                if (psEditarPersona != null) {
                    psEditarPersona.close();
                }
            } catch (SQLException e) {
                response.setStatus(false);
                response.setMessage("Error al actualizar -> " + e.getMessage() + "[" + e.getErrorCode() + "]");
            }
        }

        jsonReturn = new JSONObject(response);

        return jsonReturn;
    }

    @Override
    public JSONObject activarPersona(PersonaBean bean) {
        JSONObject jsonReturn = new JSONObject();
        String base = "demojsoncrud";
        Connection connection = null;
        PreparedStatement psEditarPersona = null;
        int resultPersona = 0;
        ResponseHelper response = new ResponseHelper();

        try {
            connection = SqlserverDAOFactory.obtenerConexion(base);
            String sql
                    = "update persona "
                    + "set estado = 1 "
                    + "where codigo = ?";

            psEditarPersona = connection.prepareStatement(sql);

            psEditarPersona.setString(1, bean.getCodigo());
            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() + "]");
        } finally {
            try {
                if (connection != null) {
                    connection.close();
                }
                if (psEditarPersona != null) {
                    psEditarPersona.close();
                }
            } catch (SQLException e) {
                response.setStatus(false);
                response.setMessage("Error al actualizar -> " + e.getMessage() + "[" + e.getErrorCode() + "]");
            }
        }

        jsonReturn = new JSONObject(response);

        return jsonReturn;
    }

    @Override
    public JSONObject desactivarPersona(PersonaBean bean) {
        JSONObject jsonReturn = new JSONObject();
        String base = "demojsoncrud";
        Connection connection = null;
        PreparedStatement psEditarPersona = null;
        int resultPersona = 0;
        ResponseHelper response = new ResponseHelper();

        try {
            connection = SqlserverDAOFactory.obtenerConexion(base);
            String sql
                    = "update persona "
                    + "set estado = 0 "
                    + "where codigo = ?";

            psEditarPersona = connection.prepareStatement(sql);
            psEditarPersona.setString(1, bean.getCodigo());
            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() + "]");
        } finally {
            try {
                if (connection != null) {
                    connection.close();
                }
                if (psEditarPersona != null) {
                    psEditarPersona.close();
                }
            } catch (SQLException e) {
                response.setStatus(false);
                response.setMessage("Error al actualizar -> " + e.getMessage() + "[" + e.getErrorCode() + "]");
            }
        }

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

}
