"""Validation utilities for user input."""
import re
from email_validator import validate_email as email_lib_validate, EmailNotValidError


def validate_email(email):
    """
    Validate email format.
    
    Returns:
        tuple: (is_valid, error_message)
    """
    if not email:
        return False, "Email is required"
    
    try:
        email_lib_validate(email)
        return True, None
    except EmailNotValidError as e:
        return False, str(e)


def validate_password(password):
    """
    Validate password strength.
    
    Requirements:
    - Minimum 8 characters
    - At least one letter
    - At least one number
    
    Returns:
        tuple: (is_valid, error_message)
    """
    if not password:
        return False, "Password is required"
    
    if len(password) < 8:
        return False, "Password must be at least 8 characters long"
    
    if not re.search(r'[A-Za-z]', password):
        return False, "Password must contain at least one letter"
    
    if not re.search(r'\d', password):
        return False, "Password must contain at least one number"
    
    return True, None


def validate_username(username):
    """
    Validate username format.
    
    Requirements:
    - 3-50 characters
    - Alphanumeric and underscores only
    - No spaces
    
    Returns:
        tuple: (is_valid, error_message)
    """
    if not username:
        return False, "Username is required"
    
    if len(username) < 3:
        return False, "Username must be at least 3 characters long"
    
    if len(username) > 50:
        return False, "Username must be 50 characters or less"
    
    if not re.match(r'^[A-Za-z0-9_]+$', username):
        return False, "Username can only contain letters, numbers, and underscores"
    
    return True, None


def validate_name(name, field_name="Name"):
    """
    Validate first name or last name.
    
    Returns:
        tuple: (is_valid, error_message)
    """
    if not name:
        return False, f"{field_name} is required"
    
    if len(name) < 1 or len(name) > 50:
        return False, f"{field_name} must be between 1 and 50 characters"
    
    return True, None