
import java.util.Scanner;

/**
 * Dieses Programm prüft anhand von fünf Bedingungen, ob ein Passwort sicher
 * ist:
 * - Mindestens 20 Zeichen lang
 * - Enthält mindestens drei Kleinbuchstaben
 * - Enthält mindestens drei Großbuchstaben
 * - Enthält mindestens drei Ziffern
 * - Enthält mindestens drei Sonderzeichen
 */

public class Passwort_Check {
    /**
     * Prüft, ob das Passwort mindestens 20 Zeichen lang ist.
     *
     * @param password Das zu prüfende Kennwort.
     * @return True, wenn das Kennwort mindestens 20 Zeichen lang ist, sonst false.
     */
    public static boolean checkLaenge(String passwort) {
        if (passwort == null) {
            return false;
        }

        return passwort.length() >= 20;
    }

    /**
     * Prüft, ob das Passwort mindestens drei Kleinbuchstaben enthält.
     *
     * @param password Das zu prüfende Kennwort.
     * @return True, wenn das Kennwort mindestens drei Kleinbuchstaben enthält,
     *         sonst false.
     */
    public static boolean checkKleinBuchstaben(String passwort) {
        if (passwort == null) {
            return false;
        }
        return passwort.matches(".*[a-z].*[a-z].*[a-z].*");
    }

    /**
     * Prüft, ob das Passwort mindestens drei Großbuchstaben enthält.
     *
     * @param password Das zu prüfende Kennwort.
     * @return True, wenn das Kennwort mindestens drei Großbuchstaben enthält, sonst
     *         false.
     */
    public static boolean checkGrossBuchstaben(String passwort) {
        if (passwort == null) {
            return false;
        }
        return passwort.matches(".*[A-Z].*[A-Z].*[A-Z].*");
    }

    /**
     * Prüft, ob das Passwort mindestens drei Ziffern enthält.
     *
     * @param password Das zu prüfende Kennwort.
     * @return True, wenn das Kennwort mindestens dreistellig ist, sonst false.
     */
    public static boolean checkZiffer(String passwort) {
        if (passwort == null) {
            return false;
        }

        return passwort.matches(".*[0-9].*[0-9].*[0-9].*");
    }

    /**
     * Prüft, ob das Passwort mindestens drei Sonderzeichen enthält.
     *
     * @param password Das zu prüfende Kennwort.
     * @return True, wenn das Kennwort mindestens drei Sonderzeichen enthält, sonst
     *         false.
     */
    public static boolean checkSonderZeichen(String passwort) {
        if (passwort == null) {
            return false;
        }
        // \\x20-\\x2F -> SP, !, ", #, $, %, &, ', (, ), *, +, ,, -, ., /
        // \\x3A-\\x40 -> :, ;, <, =, >, ?, @
        // \\x5B-\\x60 -> [, \, ], ^, -, `
        // \\x7B-\\x7E -> {, |, }, ~
        // \\x80 -> €
        String reg = "[\\x20-\\x2F\\x3A-\\x40\\x5B-\\x60\\x7B-\\x7E\\x80]";
        return passwort.matches(".*" + reg + ".*" + reg + ".*" + reg + ".*");

        // String negReg = "[^A-Za-z0-9\\x00-\\x1F\\x7F]";
        // return passwort.matches(".*"+negReg+".*"+negReg+".*"+negReg+".*");
        // return
    }

    /**
     * Hauptmethode, die den Benutzer zur Eingabe eines Passworts auffordert und
     * dessen Sicherheit anhand der definierten Bedingungen überprüft.
     *
     * @param args Kommandozeilenargumente (werden in diesem Programm nicht
     *             verwendet).
     */
    public static void main(String[] args) {
        // Variablen werden initialisiert
        String passwort = null;
        boolean check = false;  // Ein boolean das anzeigt, ob ein Passwort sicher ist
        Scanner in = new Scanner(System.in);
        System.out.println("Geben Sie ein Passwort zur überprüfung ein:");

        passwort = in.nextLine();
        // Schleife beinhaltet die Überprüfung des Passworts auf die einzelnen Bedingungen
        // s wie die wiederholung des Vorgangs bei nicht sicherem Passwort.
        do {

            if (!checkLaenge(passwort)) {
                System.out.println("Passwort ist zu kurz!");
            } else if (!checkKleinBuchstaben(passwort)) {
                System.out.println("Es fehlen Kleinbuchstaben!");
            } else if (!checkGrossBuchstaben(passwort)) {
                System.out.println("Es fehlen Großbuchstaben!");
            } else if (!checkZiffer(passwort)) {
                System.out.println("Es fehlen Ziffern!");
            } else if (!checkSonderZeichen(passwort)) {
                System.out.println("Es fehlen Sonderzeichen!");
            } else {
                System.out.println("Passwort ist sicher.");
                check = true;

            }
            if (check == false) {
                System.out.println("Geben Sie ein verbessertes Passwort zur überprüfung ein:");
                passwort = in.nextLine();
            }
        } while (check == false);

        // ende des Programms

        System.out.println("...und Tschüss");
        in.close();
    }

}
