import java.util.Scanner;

/**
 * Razred MainProgram vsebuje glavno metodo, ki omogoča interakcijo z uporabnikom preko ukazne konzole
 * za ustvarjanje in upravljanje objektov razredov AsfaltnaCesta in GorskaCesta.
 * 
 * Program omogoča:
 * - Ustvarjanje objekta AsfaltnaCesta z vnosom imena, dolžine, stanja in informacij o prometnih oznakah
 * - Ustvarjanje objekta GorskaCesta z vnosom imena, dolžine, stanja in visinske razlike
 * - Posodabljanje dolžine asfaltne ceste
 * - Posodabljanje visinske razlike gorske ceste
 * 
 * Program obdeluje morebitne napake, ki se pojavijo pri nepravilnem vnosu podatkov,
 * vključno z napakami glede dolžine ceste in stanja ceste ter drugimi napakami pri manipulaciji z objekti.
 */
public class MainProgram {
    /**
     * Glavna metoda programa, ki se zažene ob izvajanju programa.
     * 
     * Omogoča uporabniku vnos podatkov za ustvarjanje objektov AsfaltnaCesta in GorskaCesta
     * preko ukazne konzole. Program omogoča posodobitev dolžine asfaltne ceste ter visinske
     * razlike gorske ceste, ter obdeluje morebitne napake pri vnosu in manipulaciji s temi objekti.
     * 
     * @param args Argumenti ukazne vrstice (ne uporabljeni)
     */
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        try {
            // Ustvarjanje asfaltne ceste
            System.out.println("Ustvarjanje asfaltne ceste:");
            System.out.print("Vnesite ime ceste: ");
            String imeAsfaltneCeste = scanner.nextLine();
            
            System.out.print("Vnesite dolžino ceste v kilometrih: ");
            double dolzinaAsfaltneCeste = scanner.nextDouble();
            scanner.nextLine(); // Čiščenje nove vrstice
            
            System.out.print("Vnesite stanje ceste (nov, popravljen, slab): ");
            String stanjeAsfaltneCeste = scanner.nextLine();
            
            System.out.print("Ali ima cesta prometne oznake (true/false): ");
            boolean imaOznakeAsfaltneCeste = scanner.nextBoolean();
            
            AsfaltnaCesta asfaltnaCesta = new AsfaltnaCesta(imeAsfaltneCeste, dolzinaAsfaltneCeste, stanjeAsfaltneCeste, imaOznakeAsfaltneCeste);
            
            asfaltnaCesta.dodajOznake();
            
            // Ustvarjanje gorske ceste
            System.out.println("Ustvarjanje gorske ceste:");
            scanner.nextLine(); // Čiščenje nove vrstice
            System.out.print("Vnesite ime ceste: ");
            String imeGorskeCeste = scanner.nextLine();
            
            System.out.print("Vnesite dolžino ceste v kilometrih: ");
            double dolzinaGorskeCeste = scanner.nextDouble();
            scanner.nextLine(); // Čiščenje nove vrstice
            
            System.out.print("Vnesite stanje ceste (nov, popravljen, slab): ");
            String stanjeGorskeCeste = scanner.nextLine();
            
            System.out.print("Vnesite visinsko razliko ceste v metrih: ");
            double visinskaRazlikaGorskeCeste = scanner.nextDouble();
            
            GorskaCesta gorskaCesta = new GorskaCesta(imeGorskeCeste, dolzinaGorskeCeste, stanjeGorskeCeste, visinskaRazlikaGorskeCeste);
            
            gorskaCesta.posodobiVisinskoRazliko(100); // Dodaj 100 metrov
            
            // Posodobitev dolžine asfaltne ceste
            System.out.print("Vnesite dodatno dolžino za asfaltno cesto: ");
            double dodatnaDolzina = scanner.nextDouble();
            asfaltnaCesta.posodobiDolzino(dodatnaDolzina);

        } catch (DolzinaException | StanjeException e) {
            // Obdelava napak, povezanih z dolžino in stanjem
            System.out.println("Napaka: " + e.getMessage());
        } catch (IllegalStateException e) {
            // Obdelava napak pri stanju objekta
            System.out.println("Napaka: " + e.getMessage());
        } finally {
            // Zapiranje scanner objekta
            scanner.close();
        }
    }
}
