"""
Password validation utilities for enforcing password strength requirements.
"""
import re
from typing import Tuple, List

# Password strength requirements
MIN_PASSWORD_LENGTH = 8
REQUIRE_UPPERCASE = True
REQUIRE_LOWERCASE = True
REQUIRE_NUMBER = True
REQUIRE_SPECIAL = True

def validate_password_strength(password: str) -> Tuple[bool, List[str]]:
    """
    Validate password meets strength requirements.
    
    Args:
        password: The password to validate
    
    Returns:
        Tuple of (is_valid, list_of_errors)
    """
    errors = []
    
    if not password:
        return False, ['Password is required']
    
    # Check minimum length
    if len(password) < MIN_PASSWORD_LENGTH:
        errors.append(f'Password must be at least {MIN_PASSWORD_LENGTH} characters long')
    
    # Check for uppercase letter
    if REQUIRE_UPPERCASE and not re.search(r'[A-Z]', password):
        errors.append('Password must contain at least one uppercase letter')
    
    # Check for lowercase letter
    if REQUIRE_LOWERCASE and not re.search(r'[a-z]', password):
        errors.append('Password must contain at least one lowercase letter')
    
    # Check for number
    if REQUIRE_NUMBER and not re.search(r'\d', password):
        errors.append('Password must contain at least one number')
    
    # Check for special character
    if REQUIRE_SPECIAL and not re.search(r'[!@#$%^&*(),.?":{}|<>]', password):
        errors.append('Password must contain at least one special character (!@#$%^&*(),.?":{}|<>)')
    
    # Check for common weak passwords
    common_passwords = [
        'password', '12345678', 'qwerty', 'abc123', 'password123',
        'admin', 'letmein', 'welcome', 'monkey', '1234567890'
    ]
    if password.lower() in common_passwords:
        errors.append('Password is too common. Please choose a stronger password')
    
    is_valid = len(errors) == 0
    return is_valid, errors

