package hu.nye.inf;

import java.util.ArrayList;
import java.util.Scanner;
import java.time.LocalDate;

public class Autokolcsonzo {

    private static final ArrayList<Auto> autok = new ArrayList<>();
    private static final ArrayList<Berles> berlesek = new ArrayList<>();

    public static void main(String[] args) {

        kezdoAdatokFeltoltes();

        Scanner scanner = new Scanner(System.in);

        int valasztas;

        do {

            kepernyotorles();
            menuKiiras();

            System.out.print("Választás: ");

            try {

                valasztas = Integer.parseInt(scanner.nextLine());

                switch (valasztas) {

                    case 1 -> autoFelvitel(scanner);

                    case 2 -> autoTorles(scanner);

                    case 3 -> autokListazas();

                    case 4 -> berlesRogzites(scanner);

                    case 5 -> berlesTorles(scanner);

                    case 6 -> berlesekListazas();

                    case 7 -> System.out.println("Kilépés...");

                    default -> System.out.println("Érvénytelen menüpont!");
                }

            } catch (NumberFormatException e) {

                System.out.println("Számot kell megadni!");
                valasztas = 0;
            }

            if (valasztas != 7) {

                System.out.println();
                System.out.println("Nyomj Entert a folytatáshoz...");
                scanner.nextLine();
            }

        } while (valasztas != 7);

        scanner.close();
    }

    private static void kezdoAdatokFeltoltes() {

        autok.add(new Auto("FSM-355", "Ford Shelby Mustang GT500", 1967));

        autok.add(new Auto("CCI-375", "Chevrolet Camaro Indy 500 Pace Car", 1969));

        autok.add(new Auto("VXC-250", "Volvo XC70 2.5T", 2004));
    }

    private static void menuKiiras() {

        System.out.println("Menü");
        System.out.println("----");
        System.out.println();

        System.out.println("1. Autó felvitele");
        System.out.println("2. Autó törlése");
        System.out.println("3. Autók listázása");
        System.out.println("4. Bérlet rögzítése");
        System.out.println("5. Bérlet törlése");
        System.out.println("6. Bérletek listázása");
        System.out.println("7. Kilépés");

        System.out.println();
    }

    private static void kepernyotorles() {

        for (int i = 0; i < 40; i++) {
            System.out.println();
        }
    }

    private static void autoFelvitel(Scanner scanner) {

        System.out.println("--- Autó felvitele ---");

        System.out.print("Rendszám: ");
        String rendszam = scanner.nextLine();

        for (Auto auto : autok) {

            if (auto.getRendszam().equalsIgnoreCase(rendszam)) {

                System.out.println("Ez a rendszám már létezik!");
                return;
            }
        }

        System.out.print("Típus: ");
        String tipus = scanner.nextLine();

        System.out.print("Évjárat: ");

        try {

            int evjarat = Integer.parseInt(scanner.nextLine());

            autok.add(new Auto(rendszam, tipus, evjarat));

            System.out.println("Autó sikeresen felvéve.");

        } catch (NumberFormatException e) {

            System.out.println("Hibás évjárat!");
        }
    }

    private static void autoTorles(Scanner scanner) {

        System.out.println("--- Autó törlése ---");

        System.out.print("Rendszám: ");

        String rendszam = scanner.nextLine();

        for (Berles berles : berlesek) {

            if (berles.getRendszam().equalsIgnoreCase(rendszam)) {

                System.out.println("Az autóhoz még tartozik bérlés!");
                return;
            }
        }

        for (int i = 0; i < autok.size(); i++) {

            if (autok.get(i).getRendszam().equalsIgnoreCase(rendszam)) {

                autok.remove(i);

                System.out.println("Autó törölve.");

                return;
            }
        }

        System.out.println("Nincs ilyen rendszám!");
    }

    private static void autokListazas() {

        System.out.println("--- Autók listája ---");

        ArrayList<Auto> lista = new ArrayList<>(autok);

        lista.sort(new AutoRendszamComparator());

        for (Auto auto : lista) {

            System.out.println(auto);
        }
    }

    private static void berlesRogzites(Scanner scanner) {

        System.out.println("--- Bérlet rögzítése ---");

        System.out.print("Kezdő dátum (ÉÉÉÉ-HH-NN): ");

        LocalDate kezdoDatum;

        try {

            kezdoDatum = LocalDate.parse(scanner.nextLine());

        } catch (Exception e) {

            System.out.println("Hibás dátum!");
            return;
        }

        System.out.print("Záró dátum (ÉÉÉÉ-HH-NN): ");

        LocalDate zaroDatum;

        try {

            zaroDatum = LocalDate.parse(scanner.nextLine());

        } catch (Exception e) {

            System.out.println("Hibás dátum!");
            return;
        }

        if (zaroDatum.isBefore(kezdoDatum)) {

            System.out.println("A záró dátum nem lehet korábbi!");
            return;
        }

        ArrayList<Auto> szabadAutok = new ArrayList<>();

        System.out.println();
        System.out.println("Szabad autók:");

        for (Auto auto : autok) {

            if (autoSzabad(auto.getRendszam(), kezdoDatum, zaroDatum)) {

                szabadAutok.add(auto);
                System.out.println(auto);
            }
        }

        if (szabadAutok.isEmpty()) {

            System.out.println("Nincs szabad autó!");
            return;
        }

        System.out.println();

        System.out.print("Rendszám: ");

        String rendszam = scanner.nextLine();

        boolean ervenyesRendszam = false;

        for (Auto auto : szabadAutok) {

            if (auto.getRendszam().equalsIgnoreCase(rendszam)) {

                ervenyesRendszam = true;
                break;
            }
        }

        if (!ervenyesRendszam) {

            System.out.println("A megadott autó nem bérelhető!");
            return;
        }

        System.out.print("Bérlő neve: ");

        String berloNev = scanner.nextLine();

        berlesek.add(new Berles(rendszam, berloNev, kezdoDatum, zaroDatum));

        System.out.println("Bérlet sikeresen rögzítve.");
    }

    private static boolean autoSzabad(
            String rendszam,
            LocalDate ujKezdo,
            LocalDate ujZaro) {

        for (Berles berles : berlesek) {

            if (!berles.getRendszam().equalsIgnoreCase(rendszam)) {

                continue;
            }

            boolean atfedes = !(ujZaro.isBefore(berles.getKezdoDatum()) || ujKezdo.isAfter(berles.getZaroDatum()));

            if (atfedes) {

                return false;
            }
        }

        return true;
    }

    private static void berlesTorles(Scanner scanner) {

        System.out.println("--- Bérlet törlése ---");

        System.out.print("Bérlés azonosítója: ");

        int azonosito;

        try {

            azonosito = Integer.parseInt(scanner.nextLine());

        } catch (NumberFormatException e) {

            System.out.println("Hibás azonosító!");
            return;
        }

        for (int i = 0; i < berlesek.size(); i++) {

            if (berlesek.get(i).getBerlesAzonosito() == azonosito) {

                berlesek.remove(i);

                System.out.println("Bérlés törölve.");

                return;
            }
        }

        System.out.println("Nincs ilyen bérlés!");
    }

    private static void berlesekListazas() {

        System.out.println("--- Bérletek listája ---");

        ArrayList<Berles> lista = new ArrayList<>(berlesek);

        lista.sort(new BerlesAzonositoComparator());

        for (Berles berles : lista) {

            System.out.println(berles);
        }
    }
}
