package quiz;

import java.util.Scanner;

abstract class Pytanie {
    protected final String trescPytania;
    protected final String nazwaPliku;
    protected boolean czyOdpowiedzPoprawna;

    protected Pytanie(String trescPytania, String nazwaPliku) {
        this.trescPytania = trescPytania;
        this.nazwaPliku = nazwaPliku;
        this.czyOdpowiedzPoprawna = false;
    }

    public abstract boolean sprawdzOdpowiedz(String odpowiedz);
}

class PytanieZamkniete extends Pytanie {
    private final String odpowiedzA;
    private final String odpowiedzB;
    private final String odpowiedzC;
    private final String poprawnaOdpowiedz;

    public PytanieZamkniete(
            String trescPytania,
            String nazwaPliku,
            String odpowiedzA,
            String odpowiedzB,
            String odpowiedzC,
            String poprawnaOdpowiedz
    ) {
        super(trescPytania, nazwaPliku);

        this.odpowiedzA = odpowiedzA;
        this.odpowiedzB = odpowiedzB;
        this.odpowiedzC = odpowiedzC;
        this.poprawnaOdpowiedz = poprawnaOdpowiedz.trim().toUpperCase();
    }

    @Override
    public boolean sprawdzOdpowiedz(String odpowiedz) {
        String przetworzonaOdpowiedz = odpowiedz.trim().toUpperCase();
        this.czyOdpowiedzPoprawna = przetworzonaOdpowiedz.equals(this.poprawnaOdpowiedz);
        return this.czyOdpowiedzPoprawna;
    }

    public void wyswietl() {
        System.out.println(trescPytania);
        System.out.println("Obraz do pytania: " + nazwaPliku);
        System.out.println("A. " + odpowiedzA);
        System.out.println("B. " + odpowiedzB);
        System.out.println("C. " + odpowiedzC);
    }
}

public class Main {
    private static final Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) {
        /*
         * Test 1: próba utworzenia obiektu klasy abstrakcyjnej Pytanie.
         *
         * W Javie ten kod nie uruchomi się, ponieważ błąd pojawi się już
         * podczas kompilacji. Klasy abstrakcyjnej nie można instancjonować.
         *
         * Pytanie pytanie = new Pytanie("Przykładowa treść pytania", "obraz.jpg");
         * System.out.println(pytanie);
         */

        PytanieZamkniete pytanieZamkniete = utworzPytanieZamknieteZKlawiatury();

        System.out.println();
        System.out.println("Wczytane pytanie:");
        pytanieZamkniete.wyswietl();

        String odpowiedzUzytkownika = pobierzLitereOdpowiedzi(
                "Podaj odpowiedź na pytanie A, B albo C: "
        );

        if (pytanieZamkniete.sprawdzOdpowiedz(odpowiedzUzytkownika)) {
            System.out.println("Odpowiedź prawidłowa");
        } else {
            System.out.println("Odpowiedź nieprawidłowa");
        }
    }

    private static String pobierzLitereOdpowiedzi(String komunikat) {
        while (true) {
            System.out.print(komunikat);
            String odpowiedz = scanner.nextLine().trim().toUpperCase();

            if (odpowiedz.equals("A") || odpowiedz.equals("B") || odpowiedz.equals("C")) {
                return odpowiedz;
            }

            System.out.println("Nieprawidłowa wartość. Wpisz tylko A, B albo C.");
        }
    }

    private static PytanieZamkniete utworzPytanieZamknieteZKlawiatury() {
        System.out.print("Podaj treść pytania: ");
        String trescPytania = scanner.nextLine();

        System.out.print("Podaj nazwę pliku z obrazem: ");
        String nazwaPliku = scanner.nextLine();

        System.out.print("Podaj odpowiedź A: ");
        String odpowiedzA = scanner.nextLine();

        System.out.print("Podaj odpowiedź B: ");
        String odpowiedzB = scanner.nextLine();

        System.out.print("Podaj odpowiedź C: ");
        String odpowiedzC = scanner.nextLine();

        String poprawnaOdpowiedz = pobierzLitereOdpowiedzi(
                "Podaj poprawną odpowiedź A, B albo C: "
        );

        return new PytanieZamkniete(
                trescPytania,
                nazwaPliku,
                odpowiedzA,
                odpowiedzB,
                odpowiedzC,
                poprawnaOdpowiedz
        );
    }
}