"""
Константы и словари для DrHider.

Содержит:
- ENTITY_PATTERNS — regex-паттерны для обнаружения сущностей
- COMPANY_PATTERN — паттерн для обнаружения названий компаний
- PERSON_PATTERN — паттерн для обнаружения ФИО
- Словари русских имён, городов, улиц
- Список фиктивных доменов для email
"""

import re

# ═══════════════════════════════════════════════════════════════════════════
# Regex-паттерны для обнаружения сущностей в тексте документов
# ═══════════════════════════════════════════════════════════════════════════

ENTITY_PATTERNS = {
    "phone": r'(?<!\d)(?:\+7|8)[\s\-]?\(?\d{3}\)?[\s\-]?\d{3}[\s\-]?\d{2}[\s\-]?\d{2}(?!\d)',
    "email": r'\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}\b',
    # 12-значный ИНН ДО 10-значного — иначе 12-значный матчится как 10-значный
    "inn_fl": r'ИНН\s*\d{12}',
    "inn_ul": r'ИНН\s*\d{10}',
    "ogrn": r'ОГРН\s*\d{13}',
    "kpp": r'КПП\s*\d{9}',
    "bik": r'БИК\s*\d{9}',
    "rs": r'(?:р/с|расч[её]тный\s*сч[её]т)\s*\d{20}',
    "ks": r'(?:к/с|кор/сч|корр?[еи]?спондентский\s*сч[её]т)\s*\d{20}',
    "passport": r'(?:паспорт|серия\s+номер)[\s:№]*\d{2}\s*\d{2}\s*\d{6,7}',
}

# ═══════════════════════════════════════════════════════════════════════════
# Паттерны для LLM-независимого обнаружения (regex)
# ═══════════════════════════════════════════════════════════════════════════

# Названия компаний: ООО/ЗАО/АО/ПАО/ИП/ТОО + название в кавычках или без
COMPANY_PATTERN = re.compile(
    r'(?:ООО|ЗАО|ОАО|АО|ПАО|ИП|ТОО)\s+(?:«[^»]+»|"[^"]+"|\u201c[^\u201d]+\u201d|[А-ЯA-Z][\w\-\.]{2,40})',
    re.IGNORECASE,
)

# ФИО: Фамилия + инициалы (Иванов И.И.) или полное имя (Иванов Иван Иванович)
PERSON_PATTERN = re.compile(
    r'\b[А-Я][а-я]+[\s\xa0]+[А-Я]\.[А-Я]\.'
    r'|\b[А-Я][а-я]+[\s\xa0]+[А-Я][а-я]+[\s\xa0]+[А-Я][а-я]+',
)

# ═══════════════════════════════════════════════════════════════════════════
# Словари для генерации фиктивных значений
# ═══════════════════════════════════════════════════════════════════════════

# Русские фамилии (20 самых распространённых)
RU_SURNAMES = [
    "Иванов", "Смирнов", "Кузнецов", "Попов", "Васильев", "Петров",
    "Соколов", "Михайлов", "Новиков", "Фёдоров", "Морозов", "Волков",
    "Алексеев", "Лебедев", "Семёнов", "Егоров", "Павлов", "Козлов",
    "Степанов", "Николаев",
]

# Русские мужские имена
RU_NAMES = [
    "Александр", "Дмитрий", "Сергей", "Андрей", "Алексей", "Максим",
    "Евгений", "Иван", "Михаил", "Николай", "Владимир", "Павел",
    "Виктор", "Олег",
]

# Русские отчества
RU_PATRONYMICS = [
    "Александрович", "Дмитриевич", "Сергеевич", "Андреевич",
    "Алексеевич", "Иванович", "Михайлович", "Николаевич", "Владимирович",
    "Павлович", "Викторович", "Олегович", "Евгеньевич", "Максимович",
]

# Города России (15 крупнейших)
RU_CITIES = [
    "Москва", "Санкт-Петербург", "Новосибирск", "Екатеринбург",
    "Казань", "Нижний Новгород", "Челябинск", "Самара", "Омск",
    "Ростов-на-Дону", "Уфа", "Красноярск", "Воронеж", "Пермь", "Волгоград",
]

# Названия улиц
RU_STREETS = [
    "Ленина", "Мира", "Пушкина", "Гагарина", "Советская",
    "Кирова", "Октябрьская", "Молодёжная", "Садовая", "Центральная",
]

# Фиктивные домены для генерации email
FAKE_DOMAINS = ["example.ru", "mail.test", "company.local", "org.example.ru"]

# ═══════════════════════════════════════════════════════════════════════════
# Пулы для гибридных токенов (шаблон + номер)
# ═══════════════════════════════════════════════════════════════════════════

# Существительные для названий компаний (20)
COMPANY_NOUNS = [
    "Технология", "Прогресс", "Гарант", "Стандарт", "Импульс",
    "Вектор", "Сфера", "Альянс", "Синтез", "Меридиан",
    "Спектр", "Формат", "Модуль", "Ресурс", "Платформа",
    "Система", "Комплекс", "Проект", "Решение", "Сервис",
]

# Города для адресов (20)
CITY_POOL = [
    "Москва", "Санкт-Петербург", "Новосибирск", "Екатеринбург",
    "Казань", "Нижний_Новгород", "Челябинск", "Самара", "Омск",
    "Ростов-на-Дону", "Уфа", "Красноярск", "Воронеж", "Пермь",
    "Волгоград", "Краснодар", "Саратов", "Тюмень", "Иркутск", "Хабаровск",
]

# Улицы для адресов (20)
STREET_POOL = [
    "Ленина", "Мира", "Пушкина", "Гагарина", "Советская",
    "Кирова", "Октябрьская", "Молодёжная", "Садовая", "Центральная",
    "Школьная", "Лесная", "Полевая", "Строителей", "Набережная",
    "Парковая", "Солнечная", "Зелёная", "Юбилейная", "Весенняя",
]
