package capitulo09.bloque01.controlador;

import capitulo09.bloque01.modelo.Cliente;

import java.sql.*;

public class ControladorCliente {
    public static Cliente getPrimerCliente() {
        return getClienteInterno(-1);
    }

    public static Cliente getUltimoCliente() {
        return getClienteInterno(-2);
    }

    public static Cliente getCliente(int id) {
        return getClienteInterno(id);
    }

    private static Cliente getClienteInterno(int id) {
        Connection conn = PropiedadesBBDD.getConnection();
        ResultSet res = null;
        try {
            PreparedStatement stId = conn.prepareStatement("select * from cliente where id = ? limit 1");
            Statement stPrimeroUltimo = conn.createStatement();

            if (id == -1) {
                res = stPrimeroUltimo.executeQuery("select * from cliente order by id asc limit 1");
            } else if (id == -2) {
                res = stPrimeroUltimo.executeQuery("select * from cliente order by id desc limit 1");
            } else {
                stId.setInt(1, id);
                res = stId.executeQuery();
            }

            while (res.next()) {
                return new Cliente(res.getInt("id"), res.getString("nombre"), res.getString("apellidos"), res.getString("localidad"), res.getString("dniNie"), res.getDate("fechaNac"), res.getBoolean("activo"));
            }

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return null;
    }

    public static int actualizarCliente(Cliente cliente) {
        Connection conn = PropiedadesBBDD.getConnection();
        try {
            PreparedStatement ps = conn.prepareStatement("update cliente set nombre = ?, apellidos = ?, localidad = ?, dniNie = ?, fechaNac = ?, activo = ? where id = ?");

            ps.setString(1, cliente.getNombre());
            ps.setString(2, cliente.getApellidos());
            ps.setString(3, cliente.getLocalidad());
            ps.setString(4, cliente.getDniNie());
            ps.setDate(5, new Date(cliente.getFechaNac().getTime()));
            ps.setBoolean(6, cliente.isActivo());
            ps.setInt(7, cliente.getId());

            return ps.executeUpdate();

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    public static int nuevoCliente(Cliente cliente) {
        Connection conn = PropiedadesBBDD.getConnection();
        try {
            PreparedStatement ps = conn.prepareStatement("insert into cliente (id, nombre, apellidos, localidad, dniNie, fechaNac, activo) values (?, ?, ?, ?, ?, ?, ?)");

            ps.setInt(1, cliente.getId());
            ps.setString(2, cliente.getNombre());
            ps.setString(3, cliente.getApellidos());
            ps.setString(4, cliente.getLocalidad());
            ps.setString(5, cliente.getDniNie());
            ps.setDate(6, new Date(cliente.getFechaNac().getTime()));
            ps.setBoolean(7, cliente.isActivo());

            return ps.executeUpdate();

    } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    public static int eliminarCliente(int id) {
        Connection conn = PropiedadesBBDD.getConnection();
        try {
            PreparedStatement ps = conn.prepareStatement("delete from cliente where id = ?");
            ps.setInt(1, id);
            return ps.executeUpdate();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}
