package automotoras06;

import java.sql.*;
import java.util.*;

/**
 * Esta Clase es la que se va a encargar de realizar las operaciones de
 * base de datos para los vehiculos.
 * VehiculoDAO -> objeto de Acceso a datos de Vehiculos.
 */
public class VehiculoDAO {

    /*
     * Trae la lista de todos los vehiculos registrados
     * Es solo un primer paso, realmente lo que nos va a importar son las
     * consultas en las que se hace una busqueda.
     * @return la lista de vehiculos registrados.
     */
    /**
     * este metodo lista en un arreglo de vehiculos, lo que contiene la base de datos
     * @return la lista de los vehiculos
     */
    public ArrayList<Vehiculo> listar() {
        ArrayList<Vehiculo> respuesta = new ArrayList<Vehiculo>();
        try {
            Connection conexion = GestorConexion.getConexion();
            // La consulta en este caso es muy Simple:
            String sql = "SELECT * FROM vehiculos";
            Statement stat = conexion.createStatement();
            ResultSet rs = stat.executeQuery(sql);
            while (rs.next()) {
                respuesta.add(cargarVehiculo(rs));
            }
        } catch (SQLException e) {
            System.err.println("Error en el módulo de Respuesta de la DataBase.");
        } finally {
            return respuesta;
        }
    }

    private Vehiculo cargarVehiculo(ResultSet rs) throws SQLException {

        Vehiculo vehiculo = new Vehiculo();
        vehiculo.setId(rs.getInt("id"));
        vehiculo.setPatente(rs.getString("patente"));
        vehiculo.setMarca(rs.getString("marca"));
        vehiculo.setColor(rs.getString("color"));
        vehiculo.setModelo(rs.getString("modelo"));
        vehiculo.setPrecio(rs.getInt("precio"));
        vehiculo.setKilometraje(rs.getInt("kilometraje"));
        vehiculo.setAnio(rs.getInt("anio"));
        vehiculo.setVendido(rs.getBoolean("vendido"));
        vehiculo.setfoto(rs.getString("foto"));
        return vehiculo;
    }

    /**
     * este metodo envia la informacion que esta contenida en la pantalla.
     * para ser ingresado a la base de datos.
     * @param vehiculo es el vehiculo que va a ser agregado
     */
    public void guardar(Vehiculo vehiculo){
        // Este metodo toma la decision... si no hay id asignada, se hace un
        // insert, si el id ya existe, se hace un update.
        if ( vehiculo.getId() == null ){
            insertar(vehiculo);
        }
        else {
            actualizar(vehiculo);
        }
    }

    private void insertar(Vehiculo vehiculo){
        try{
            Connection conexion = GestorConexion.getConexion();
            String sql = "INSERT INTO vehiculos (id, patente, marca, modelo, " +
                    " anio, kilometraje, color, precio, foto, vendido ) " +
                    " VALUES " +
                    "(null, ?, ? , ?, ?, ?, ? , ? , ?, ?);";
            PreparedStatement comando = conexion.prepareStatement(sql ,
                    Statement.RETURN_GENERATED_KEYS );
            comando.setString(1, vehiculo.getPatente());
            comando.setString(2, vehiculo.getMarca());
            comando.setString(3, vehiculo.getModelo());
            comando.setInt(4, vehiculo.getAnio());
            comando.setInt(5, vehiculo.getKilometraje());
            comando.setString(6, vehiculo.getColor());
            comando.setInt(7, vehiculo.getPrecio());
            comando.setString(8, vehiculo.getfoto());
            comando.setBoolean(9, vehiculo.getVendido());
            
            // ejecutamos...
            int afectados = comando.executeUpdate();
            if (afectados == 1){
                ResultSet rs = comando.getGeneratedKeys();
                rs.next(); // sabemos que hay 1 registro!
                int id = rs.getInt(1); // la unica columna trae los id!
                vehiculo.setId(id);
            }
        }
        catch(SQLException ex){
            System.err.println("Error en la ejecucion del insertar " + ex);
        }
    }

    private void actualizar(Vehiculo vehiculo){
        try{
            Connection conexion = GestorConexion.getConexion();
            String sql = "UPDATE vehiculos " +
                    "set  patente = ?, " +
                    "marca = ?, " +
                    "modelo = ?, " +
                    " anio = ?, " +
                    "kilometraje = ?, " +
                    "color = ?, " +
                    "precio = ?, " +
                    "foto = ?,  " +
                    "vendido = ?  " +
                    " WHERE  " +
                    " id = ? ;";
            PreparedStatement comando = conexion.prepareStatement(sql);
            comando.setString(1, vehiculo.getPatente());
            comando.setString(2, vehiculo.getMarca());
            comando.setString(3, vehiculo.getModelo());
            comando.setInt(4, vehiculo.getAnio());
            comando.setInt(5, vehiculo.getKilometraje());
            comando.setString(6, vehiculo.getColor());
            comando.setInt(7, vehiculo.getPrecio());
            comando.setString(8, vehiculo.getfoto());
            comando.setBoolean(9, vehiculo.getVendido());
            comando.setInt(10, vehiculo.getId());
            
            // ejecutamos...
            comando.executeUpdate();
        }
        catch(SQLException ex){
            System.err.println("Error en la ejecucion del insertar " + ex);
        }
    }
}






















