"""
Валидация данных
"""
import re


def validate_apartment(apartment: str) -> bool:
    """
    Проверка номера квартиры
    Допустимы: цифры, буквы (корпус/строение), дефисы
    Примеры: 45, 12А, 100-1, 5к1
    """
    if not apartment:
        return False
    
    # Убираем пробелы и приводим к верхнему регистру
    apartment = apartment.strip().upper()
    
    # Простая проверка: от 1 до 10 символов, есть хотя бы цифра
    if len(apartment) > 10 or len(apartment) < 1:
        return False
    
    if not any(c.isdigit() for c in apartment):
        return False
    
    # Разрешённые символы: цифры, буквы, дефис, пробел, к/к (корпус)
    pattern = r'^[0-9А-ЯA-Z\s\-/]+$'
    return bool(re.match(pattern, apartment))


def validate_phone(phone: str) -> bool:
    """
    Проверка телефона
    Допустимы: +7, 8, скобки, дефисы, пробелы
    """
    if not phone:
        return False
    
    # Убираем всё кроме цифр и +
    cleaned = re.sub(r'[^\d+]', '', phone)
    
    # Российские номера: +7 или 8, потом 10 цифр
    if len(cleaned) == 11 and cleaned[0] in ('7', '8'):
        return True
    if len(cleaned) == 12 and cleaned[0] == '+' and cleaned[1] == '7':
        return True
    
    # Короткие номера (103, 112 и т.д.)
    if len(cleaned) in (2, 3) and cleaned.isdigit():
        return True
    
    return False


def normalize_phone(phone: str) -> str:
    """Нормализация телефона к единому формату"""
    cleaned = re.sub(r'[^\d+]', '', phone)
    
    if len(cleaned) == 11 and cleaned[0] == '8':
        return '+7' + cleaned[1:]
    if len(cleaned) == 11 and cleaned[0] == '7':
        return '+' + cleaned
    if len(cleaned) == 12 and cleaned[0] == '+':
        return cleaned
    
    return phone  # Короткие номера оставляем как есть


def is_generic_username(username: str) -> bool:
    """
    Проверка, является ли никнейм «стандартным»
    user12345, user_abc123 и т.п.
    """
    if not username:
        return True
    
    # Паттерны стандартных ников
    patterns = [
        r'^user\d+$',
        r'^user_\w+$',
        r'^id\d+$',
        r'^\d+$',  # Просто цифры
    ]
    
    return any(re.match(p, username.lower()) for p in patterns)
