// package uebung4;

/*Programm, dass ein eingegebenes Passwort auf seine Sicherheit überprüft.
Es soll mindestens 20 Zeichen und mindestens 3 Klein-, Großbuchstaben, Ziffern und Sonderzeichen beinhalten.*/

import java.util.Scanner;

public class message {
	
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        boolean istPasswortSicher = false;//Passwort wird initial auf false gesetzt
        String passwort;// String-Variable zum Speichern des Passworts
        System.out.println("Willkommen beim Passwort-Checker!");
        
        //Überprüfung und Ausgabe des Problems oder der Sicherheit des Passworts
        do {
            System.out.print("Bitte geben Sie ein Passwort ein: ");
            passwort = scanner.nextLine();/* speichert die Benutzereingabe in der Variable passwort*/

            if (!checkLaenge(passwort)) {
                System.out.println("Fehler: Das Passwort ist zu kurz. Es muss mindestens 20 Zeichen lang sein.");
            }
          
            else if (!checkKleinBuchstaben(passwort)) {
            System.out.println("Fehler: Das Passwort muss mindestens 3 Kleinbuchstaben enthalten.");
            }
        
            
            else if (!checkGrossBuchstaben(passwort)) {
            System.out.println("Fehler: Das Passwort muss mindestens 3 Großbuchstaben enthalten.");
            }
           
            
            else if (!checkZiffer(passwort)) {
            System.out.println("Fehler: Das Passwort muss mindestens 3 Ziffern enthalten.");
            }
          
    
            else if (!checkSonderZeichen(passwort)) {
            System.out.println("Fehler: Das Passwort muss mindestens 3 Sonderzeichen enthalten.");
            }
            
            
            else {
            istPasswortSicher = true;
            System.out.println("Passwort ist sicher.");
            }
        }while (!istPasswortSicher);//wiederhole die Eingabe bis Passwort sicher ist
            
         
        scanner.close();
        System.out.println("Programm beendet.");
        //wenn das Passwort sicher ist, wird das Programm beendet
    }
    
    /*Rückgabewert ist true, wenn das Passwort mindestens 20 Zeichen enthält, ansonsten wird false zurückgegeben*/
    public static boolean checkLaenge(String passwort) {
        return passwort != null && passwort.length() >= 20;
    }
    
    /*Rückgabewert ist true, wenn das Passwort mindestens 3 Kleinbuchstaben enthält, ansonsten wird false zurückgegeben*/
    public static boolean checkKleinBuchstaben(String passwort) {
        //Anzahl der Kleinbuchstaben wird gezählt
        int count = 0;
        if (passwort==null) {
        	return false;
        }
        for (char c : passwort.toCharArray()) {
            if (Character.isLowerCase(c)) {
                count++;
            }
        }
        return count >= 3;
        //wenn Anzahl der Kleinbuchstaben größer gleich 3 ist, wird true zurückgegeben
    }
    
    /*Rückgabewert ist true, wenn das Passwort mindestens 3 Großbuchstaben enthält, ansonsten wird false zurückgegeben*/
    public static boolean checkGrossBuchstaben(String passwort) {
      //Anzahl der Großbuchstaben wird gezählt
        int count = 0;
        if (passwort==null) {
        	return false;
        }
        for (char c : passwort.toCharArray()) {
            if (Character.isUpperCase(c)) {
                count++;
            }
        }
        return count >= 3;
        //wenn Anzahl der Großbuchstaben größer gleich 3 ist, wird true zurückgegeben
    }
    
    /*Rückgabewert ist true, wenn das Passwort mindestens 3 Ziffern enthält, ansonsten wird false zurückgegeben*/
    public static boolean checkZiffer(String passwort) {
        //Anzahl der Zahlen wird gezählt
        int count = 0;
        if (passwort==null) {
        	return false;
        }
        for (char c : passwort.toCharArray()) {
            if (Character.isDigit(c)) {
                count++;
            }
        }
        return count >= 3;
        //wenn Anzahl der Zahlen größer gleich 3 ist, wird true zurückgegeben
    }
    
    /*Rückgabewert ist true, wenn das Passwort mindestens 3 Sonderzeichen enthält, ansonsten wird false zurückgegeben*/
    public static boolean checkSonderZeichen(String passwort) {
        int count = 0;
        if (passwort==null) {
        	return false;
        }
        for (char c : passwort.toCharArray()) {
            int ascii = (int) c;
            if ((ascii >= 32 && ascii <= 47) || (ascii >= 58 && ascii <= 64) ||
                (ascii >= 91 && ascii <= 96) || (ascii >= 123 && ascii <= 126) ||
                ascii == 128 || ascii == 130 || ascii == 132 || ascii == 136) {
               count++;
            }
        }
        return count >= 3;
        //wenn Anzahl der Sonderzeichen größer gleich 3 ist, wird true zurückgegeben
    }  
    
}