#!/usr/bin/env python3
"""
Zadanie 2: Generator hasel losowych
Program generuje bezpieczne hasla losowe o okreslonej dlugosci.
"""

import secrets
import string
import sys


def generuj_haslo(dlugosc=12):
    """Generuje haslo losowe o okreslonej dlugosci."""
    if dlugosc < 4:
        dlugosc = 4
    elif dlugosc > 64:
        dlugosc = 64
    
    znaki = string.ascii_letters + string.digits + string.punctuation
    
    haslo = [
        secrets.choice(string.ascii_lowercase),
        secrets.choice(string.ascii_uppercase),
        secrets.choice(string.digits),
        secrets.choice(string.punctuation)
    ]
    
    if dlugosc > 4:
        haslo += [secrets.choice(znaki) for _ in range(dlugosc - 4)]
    
    haslo = ''.join(haslo)
    hasla = list(haslo)
    secrets.SystemRandom().shuffle(hasla)
    return ''.join(hasla)


def sprawdz_sile(haslo):
    """Sprawdza sile hasla."""
    male = sum(1 for c in haslo if c in string.ascii_lowercase)
    wielkie = sum(1 for c in haslo if c in string.ascii_uppercase)
    cyfry = sum(1 for c in haslo if c in string.digits)
    specjalne = sum(1 for c in haslo if c in string.punctuation)
    
    return {
        'male': male,
        'wielkie': wielkie,
        'cyfry': cyfry,
        'specjalne': specjalne,
        'dlugosc': len(haslo)
    }


def main():
    """Glowna funkcja programu."""
    dlugosc = 12
    
    if len(sys.argv) > 1:
        try:
            dlugosc = int(sys.argv[1])
        except ValueError:
            pass
    
    print("=" * 40)
    print("  GENERATOR HASEL LOSOWYCH")
    print("=" * 40)
    print(f"\nDlugosc: {dlugosc}")
    
    haslo = generuj_haslo(dlugosc)
    print(f"\nWygenerowane haslo:")
    print(f"  {haslo}")
    
    statystyki = sprawdz_sile(haslo)
    print(f"\nStatystyki:")
    print(f"  Male litery:   {statystyki['male']}")
    print(f"  Wielkie litery: {statystyki['wielkie']}")
    print(f"  Cyfry:        {statystyki['cyfry']}")
    print(f"  Znaki specjalne: {statystyki['specjalne']}")


if __name__ == "__main__":
    main()