package capitulo08.bloque01y02;

import capitulo08.bloque01y02.operaciones.Delete;
import capitulo08.bloque01y02.operaciones.Insert;
import capitulo08.bloque01y02.operaciones.Select;
import capitulo08.bloque01y02.operaciones.Update;

import java.sql.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

import static capitulo04.utils.Utils.solicitarIntScannerInline;
import static capitulo04.utils.Utils.solicitarStringScannerInline;

public class Main {
    public static void main(String[] args) {
        int opcion = 0;
        Connection conn = null;
        try {
            conn = getConexion();
        } catch (SQLException | ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
        do {
            System.out.println(
                    "\n¿Qué quieres administrar?:\n" +
                            "0 - Salir del programa\n" +
                            "1 - Coches\n" +
                            "2 - Fabricantes\n" +
                            "3 - Concesionarios\n" +
                            "4 - Clientes\n" +
                            "5 - Ventas");
            opcion = solicitarIntScannerInline("> ");

            switch (opcion) {
                case 1:
                    menuCoches(conn);
                    break;
                case 2:
                    menuFabricantes(conn);
                    break;
                case 3:
                    menuConcesionarios(conn);
                    break;
                case 4:
                    menuClientes(conn);
                    break;
                case 5:
                    menuVentas(conn);
                    break;

            }


        } while (opcion != 0);

        try {
            conn.close();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    private static Connection getConexion() throws ClassNotFoundException, SQLException {
        //Class.forName(PropiedadesBBDD.getMySQLDriver());
        return DriverManager.getConnection(PropiedadesBBDD.getMySQLConnectionString());
    }


    private static void menuFabricantes(Connection conn) {
        int opcion = 0;
        do {
            System.out.println(
                    "\nSeleccione una operación:\n" +
                            "0 - Volver atrás\n" +
                            "1 - Mostrar todos los fabricantes\n" +
                            "2 - Añadir un fabricante\n" +
                            "3 - Actualizar un fabricante\n" +
                            "4 - Eliminar un fabricante");
            opcion = solicitarIntScannerInline("> ");

            try {
                switch (opcion) {
                    case 1: {
                        Select.mostrarTabla(conn, "fabricante");
                        break;
                    }
                    case 2: {
                        Insert.addFabricante(conn,
                                solicitarStringScannerInline("Introduzca el CIF: "),
                                solicitarStringScannerInline("Introduzca el Nombre: "));
                        break;
                    }
                    case 3: {
                        int id;
                        do {
                            id = solicitarIntScannerInline("Introduzca el ID del fabricante: ");
                        } while (!Select.isIdValid(conn, "fabricante", id));
                        String cifNuevo = solicitarStringScannerInline("Introduzca el nuevo CIF (en blanco para no cambiar): ");
                        String nombreNuevo = solicitarStringScannerInline("Introduzca el nuevo Nombre (en blanco para no cambiar): ");
                        Update.actualizarFabricante(conn, id, cifNuevo, nombreNuevo);
                        break;
                    }
                    case 4: {
                        int id;
                        do {
                            id = solicitarIntScannerInline("Introduzca el ID del fabricante: ");
                        } while (!Select.isIdValid(conn, "fabricante", id));
                        Delete.eliminarRegistro(conn, "fabricante", id);
                        break;
                    }
                }
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }

        } while (opcion != 0);
    }

    private static void menuCoches(Connection conn) {
        int opcion = 0;
        do {
            System.out.println(
                    "\nSeleccione una operación:\n" +
                            "0 - Volver atrás\n" +
                            "1 - Mostrar todos los coches\n" +
                            "2 - Añadir un coche\n" +
                            "3 - Actualizar un coche\n" +
                            "4 - Eliminar un coche");
            opcion = solicitarIntScannerInline("> ");

            try {
                switch (opcion) {
                    case 1: {
                        Select.mostrarTabla(conn, "coche");
                        break;
                    }
                    case 2: {
                        Insert.addCoche(conn,
                                solicitarIntScannerInline("Introduzca el ID del fabricante: "),
                                solicitarStringScannerInline("Introduzca número del bastidor: "),
                                solicitarStringScannerInline("Introduzca el modelo: "),
                                solicitarStringScannerInline("Introduzca el color: "));
                        break;
                    }
                    case 3: {
                        int id;
                        int idFabricante;
                        do {
                            id = solicitarIntScannerInline("Introduzca el ID del coche: ");
                        } while (!Select.isIdValid(conn, "coche", id));
                        do {
                            idFabricante = solicitarIntScannerInline("Introduzca el nuevo id del Fabricante (0 para no cambiar): ");
                        } while (!Select.isIdValid(conn, "fabricante", idFabricante) && !(idFabricante == 0));
                        String numBastidor = solicitarStringScannerInline("Introduzca el nuevo número de bastidor (en blanco para no cambiar): ");
                        String modelo = solicitarStringScannerInline("Introduzca el nuevo modelo (en blanco para no cambiar): ");
                        String color = solicitarStringScannerInline("Introduzca el nuevo color (en blanco para no cambiar): ");
                        Update.actualizarCoche(conn, id, idFabricante, numBastidor, modelo, color);
                        break;
                    }
                    case 4: {
                        int id;
                        do {
                            id = solicitarIntScannerInline("Introduzca el ID del coche: ");
                        } while (!Select.isIdValid(conn, "coche", id));
                        Delete.eliminarRegistro(conn, "coche", id);
                        break;
                    }
                }
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }

        } while (opcion != 0);
    }

    private static void menuConcesionarios(Connection conn) {
        int opcion = 0;
        do {
            System.out.println(
                    "\nSeleccione una operación:\n" +
                            "0 - Volver atrás\n" +
                            "1 - Mostrar todos los concesionarios\n" +
                            "2 - Añadir un concesionario\n" +
                            "3 - Actualizar un concesionario\n" +
                            "4 - Eliminar un concesionario");
            opcion = solicitarIntScannerInline("> ");

            try {
                switch (opcion) {
                    case 1: {
                        Select.mostrarTabla(conn, "concesionario");
                        break;
                    }
                    case 2: {
                        Insert.addConcesionario(conn,
                                solicitarStringScannerInline("Introduzca el CIF: "),
                                solicitarStringScannerInline("Introduzca el Nombre: "),
                                solicitarStringScannerInline("Introduzca la Localidad: "));
                        break;
                    }
                    case 3: {
                        int id;
                        do {
                            id = solicitarIntScannerInline("Introduzca el ID del concesionario: ");
                        } while (!Select.isIdValid(conn, "concesionario", id));
                        String cifNuevo = solicitarStringScannerInline("Introduzca el nuevo CIF (en blanco para no cambiar): ");
                        String nombreNuevo = solicitarStringScannerInline("Introduzca el nuevo Nombre (en blanco para no cambiar): ");
                        String localidadNueva = solicitarStringScannerInline("Introduzca la nueva Localidad (en blanco para no cambiar): ");
                        Update.actualizarConcesionario(conn, id, cifNuevo, nombreNuevo, localidadNueva);
                        break;
                    }
                    case 4: {
                        int id;
                        do {
                            id = solicitarIntScannerInline("Introduzca el ID del concesionario: ");
                        } while (!Select.isIdValid(conn, "concesionario", id));
                        Delete.eliminarRegistro(conn, "concesionario", id);
                        break;
                    }
                }
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }

        } while (opcion != 0);
    }

    private static void menuClientes(Connection conn) {
        int opcion = 0;
        do {
            System.out.println(
                    "\nSeleccione una operación:\n" +
                            "0 - Volver atrás\n" +
                            "1 - Mostrar todos los clientes\n" +
                            "2 - Añadir un cliente\n" +
                            "3 - Actualizar un cliente\n" +
                            "4 - Eliminar un cliente");
            opcion = solicitarIntScannerInline("> ");

            try {
                switch (opcion) {
                    case 1: {
                        Select.mostrarTabla(conn, "cliente");
                        break;
                    }
                    case 2: {
                        Insert.addCliente(conn,
                                solicitarStringScannerInline("Introduzca el Nombre: "),
                                solicitarStringScannerInline("Introduzca los Apellidos: "),
                                solicitarStringScannerInline("Introduzca la Localidad: "),
                                solicitarStringScannerInline("Introduzca el DNI/NIE: "),
                                solicitarFechaInline("fecha de nacimiento", "dd/MM/yyyy"),
                                solicitarIntScannerInline("Introduzca el estado (0 -> NO o 1 -> SÍ): "));
                        break;
                    }
                    case 3: {
                        int id;
                        do {
                            id = solicitarIntScannerInline("Introduzca el ID del cliente: ");
                        } while (!Select.isIdValid(conn, "cliente", id));

                        String nuevoNombre = solicitarStringScannerInline("Introduzca el nuevo Nombre (en blanco para no cambiar): ");
                        String nuevosApellidos = solicitarStringScannerInline("Introduzca los Apellidos (en blanco para no cambiar): ");
                        String nuevaLocalidad = solicitarStringScannerInline("Introduzca la Localidad (en blanco para no cambiar): ");
                        String nuevoDNI = solicitarStringScannerInline("Introduzca el DNI/NIE (en blanco para no cambiar): ");
                        Date nuevaFecha = solicitarFechaInline("fecha de nacimiento", "dd/MM/yyyy");
                        int nuevoEstado = solicitarIntScannerInline("Introduzca el estado (0 -> NO o 1 -> SÍ): ");

                        Update.actualizarCliente(conn, id, nuevoNombre, nuevosApellidos, nuevaLocalidad, nuevoDNI, nuevaFecha, nuevoEstado);
                        break;
                    }
                    case 4: {
                        int id;
                        do {
                            id = solicitarIntScannerInline("Introduzca el ID del cliente: ");
                        } while (!Select.isIdValid(conn, "cliente", id));
                        Delete.eliminarRegistro(conn, "cliente", id);
                        break;
                    }
                }
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }

        } while (opcion != 0);
    }

    private static void menuVentas(Connection conn) {
        int opcion = 0;
        do {
            System.out.println(
                    "\nSeleccione una operación:\n" +
                            "0 - Volver atrás\n" +
                            "1 - Mostrar todas las ventas\n" +
                            "2 - Añadir una venta\n" +
                            "3 - Actualizar una venta\n" +
                            "4 - Eliminar una venta");
            opcion = solicitarIntScannerInline("> ");

            try {
                switch (opcion) {
                    case 1: {
                        Select.mostrarTabla(conn, "venta");
                        break;
                    }
                    case 2: {
                        int idCliente;
                        int idConcesionario;
                        int idCoche;
                        do {
                            idCliente = solicitarIntScannerInline("Introduzca el ID del Cliente: ");
                        } while (!Select.isIdValid(conn, "cliente", idCliente));
                        do {
                            idConcesionario = solicitarIntScannerInline("Introduzca el ID del Concesionario: ");
                        } while (!Select.isIdValid(conn, "concesionario", idConcesionario));
                        do {
                            idCoche = solicitarIntScannerInline("Introduzca el ID del Coche: ");
                        } while (!Select.isIdValid(conn, "coche", idCoche));

                        Insert.addVenta(conn,
                                idCliente,
                                idConcesionario,
                                idCoche,
                                solicitarFechaInline("fecha de venta", "dd/MM/yyyy"),
                                solicitarIntScannerInline("Introduzca el precio de Venta: "));
                        break;
                    }
                    case 3: {
                        int id;
                        do {
                            id = solicitarIntScannerInline("Introduzca el ID de la venta: ");
                        } while (!Select.isIdValid(conn, "venta", id));

                        int nuevoIdCliente;
                        int nuevoIdConcesionario;
                        int nuevoIdCoche;
                        do {
                            nuevoIdCliente = solicitarIntScannerInline("Introduzca el nuevo ID del Cliente (0 para no cambiar): ");
                        } while (!(nuevoIdCliente == 0 || Select.isIdValid(conn, "cliente", nuevoIdCliente)));
                        do {
                            nuevoIdConcesionario = solicitarIntScannerInline("Introduzca el nuevo ID del Concesionario (0 para no cambiar): ");
                        } while (!(nuevoIdConcesionario == 0 || Select.isIdValid(conn, "concesionario", nuevoIdConcesionario)));
                        do {
                            nuevoIdCoche = solicitarIntScannerInline("Introduzca el nuevo ID del Coche (0 para no cambiar): ");
                        } while (!(nuevoIdCoche == 0 || Select.isIdValid(conn, "coche", nuevoIdCoche)));

                        Date nuevaFecha = solicitarFechaInline("fecha de nacimiento", "dd/MM/yyyy");
                        int nuevoPrecio = solicitarIntScannerInline("Introduzca el nuevo precio de Venta (0 para no cambiar): ");

                        Update.actualizarVenta(conn, id, nuevoIdCliente, nuevoIdConcesionario, nuevoIdCoche, nuevaFecha, nuevoPrecio);
                        break;
                    }
                    case 4: {
                        int id;
                        do {
                            id = solicitarIntScannerInline("Introduzca el ID de la venta: ");
                        } while (!Select.isIdValid(conn, "venta", id));
                        Delete.eliminarRegistro(conn, "venta", id);
                        break;
                    }
                }
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }

        } while (opcion != 0);
    }


    public static Date solicitarFechaInline(String solicitud, String formato) {
        Scanner sc = new Scanner(System.in);
        SimpleDateFormat formatoFecha = new SimpleDateFormat(formato);

        while (true) {
            System.out.print("Introduzca una " + solicitud + " con este formato ( " + formato + " ) > ");
            String fechaIntroducida = sc.nextLine();

            try {
                return formatoFecha.parse(fechaIntroducida);
            } catch (ParseException e) {
                System.out.println("\nVuelva a introducir la fecha, en el formato correcto: " + formato);
            }
        }
    }

}