"""Broad-fuzz: 60+ профилей × кросс-доменные вакансии. Ожидание: профиль матчит
только вакансии своей сферы, никогда — чужой узкоспециальной (особенно IT)."""
import sys; sys.path.insert(0, ".")
from bot.vacancy_filters import profile_domains, matches_vacancy_relevance as mv

# (специальность, навыки как их пишет AI, сфера)
PROFILES = [
    # Общепит / сервис
    ("Официант", "Работа в ресторанах, обслуживание посетителей", "food"),
    ("Повар", "Работа на кухне, приготовление блюд, санитарные нормы", "food"),
    ("Бармен", "Приготовление коктейлей, работа с кассой", "food"),
    ("Бариста", "Приготовление кофе, работа с посетителями", "food"),
    ("Кондитер", "Выпечка тортов, работа с тестом", "food"),
    ("Пекарь", "Выпечка хлеба, работа в ночную смену", "food"),
    ("Хостес", "Встреча гостей, работа в ресторане", "food"),
    ("Посудомойщица", "Мытьё посуды, уборка кухни", "food"),
    # Торговля
    ("Продавец", "Работа в торговом зале, выкладка товара", "trade"),
    ("Кассир", "Работа с кассой, обслуживание покупателей", "trade"),
    ("Мерчендайзер", "Выкладка товара, работа с накладными", "trade"),
    ("Товаровед", "Приёмка товара, работа с документами", "trade"),
    # Рабочие / стройка
    ("Электрик", "Монтаж проводки, работа с электрооборудованием", "manual"),
    ("Сантехник", "Установка сантехники, ремонтные работы", "manual"),
    ("Сварщик", "Аргонная сварка, работа с металлом", "manual"),
    ("Маляр", "Покраска стен, отделочные работы", "manual"),
    ("Плиточник", "Укладка плитки, ремонт квартир", "manual"),
    ("Грузчик", "Погрузка, разгрузка, физическая работа", "manual"),
    ("Разнорабочий", "Разные работы на стройке", "manual"),
    ("Токарь", "Работа на станке, обработка металла", "manual"),
    ("Слесарь", "Ремонт оборудования, слесарные работы", "manual"),
    ("Столяр", "Работа с деревом, изготовление мебели", "manual"),
    ("Сборщик мебели", "Сборка корпусной мебели, работа с инструментом", "manual"),
    ("Швея", "Пошив одежды, работа на швейной машине", "manual"),
    # Транспорт / логистика
    ("Водитель", "Работа на личном авто, категория B", "transport"),
    ("Курьер", "Доставка заказов, подработка вечерами", "transport"),
    ("Таксист", "Перевозка пассажиров, работа в такси", "transport"),
    ("Кладовщик", "Работа на складе, приёмка товара", "transport"),
    ("Экспедитор", "Сопровождение грузов, работа с накладными", "transport"),
    ("Комплектовщик", "Сборка заказов на складе", "transport"),
    # Красота / здоровье
    ("Парикмахер", "Стрижки, окрашивание, работа с клиентами", "beauty"),
    ("Мастер маникюра", "Маникюр, педикюр, работа с клиентами", "beauty"),
    ("Косметолог", "Уходовые процедуры, работа с аппаратами", "beauty"),
    ("Массажист", "Лечебный массаж, работа с клиентами", "beauty"),
    ("Фитнес-тренер", "Персональные тренировки, работа с группами", "beauty"),
    # Медицина
    ("Медсестра", "Работа в стационаре, процедуры, уколы", "med"),
    ("Фармацевт", "Работа в аптеке, отпуск лекарств", "med"),
    ("Ветеринар", "Лечение животных, работа в клинике", "med"),
    ("Сиделка", "Уход за пожилыми, работа с проживанием", "med"),
    # Образование
    ("Учитель математики", "Преподавание, подготовка к ЕГЭ", "edu"),
    ("Воспитатель", "Работа с детьми в детском саду", "edu"),
    ("Няня", "Уход за детьми, работа в семье", "edu"),
    ("Репетитор английского", "Английский язык, подготовка к экзаменам", "edu"),
    # Офис / финансы
    ("Бухгалтер", "1с, работа с первичной документацией", "office_fin"),
    ("Юрист", "Договорная работа, судебная практика", "office_fin"),
    ("Секретарь", "Документооборот, работа с оргтехникой", "office_fin"),
    ("Оператор колл-центра", "Обработка входящих звонков, работа с клиентами", "office_fin"),
    ("Менеджер по продажам", "Холодные звонки, работа с CRM", "office_fin"),
    ("HR-менеджер", "Подбор персонала, проведение собеседований", "office_fin"),
    # Охрана / клининг
    ("Охранник", "Работа сутки через двое, охрана объекта", "sec_clean"),
    ("Уборщица", "Уборка офисов, работа по графику", "sec_clean"),
    ("Горничная", "Уборка номеров, работа в отеле", "sec_clean"),
    ("Дворник", "Уборка территории, работа утром", "sec_clean"),
    # Авто
    ("Автомеханик", "Ремонт двигателей, работа в автосервисе", "auto"),
    ("Автомойщик", "Мойка автомобилей, работа посменно", "auto"),
    ("Шиномонтажник", "Шиномонтаж, балансировка колёс", "auto"),
    # Сельское / прочее
    ("Флорист", "Составление букетов, работа с цветами", "other"),
    ("Садовник", "Уход за растениями, работа на участке", "other"),
    ("Рыбообработчик", "Переработка рыбы, работа на производстве", "other"),
    ("Оператор станка", "Работа на производстве, обработка деталей", "other"),
    ("Фотограф", "Съёмка мероприятий, обработка фотографий", "creative"),
    ("Дизайнер интерьера", "Дизайн-проекты, работа с заказчиками", "creative"),
    # IT (контроль — ДОЛЖНЫ матчить IT)
    ("Python разработчик", "Telegram бот, aiogram, работа с API", "it"),
    ("Тестировщик", "Ручное тестирование, работа с багтрекером", "it"),
    ("Системный администратор", "Настройка серверов, работа с сетью linux", "it"),
    ("1С программист", "Доработка конфигураций 1С, работа с запросами", "it"),
]

# Кросс-доменная батарея вакансий: (title, description, source, сфера)
VACS = [
    ("Python разработчик (Telegram бот)", "aiogram, API", "hh", "it"),
    ("Frontend разработчик React", "вёрстка, javascript", "habr", "it"),
    ("DevOps инженер", "kubernetes, docker", "hh", "it"),
    ("QA инженер", "тестирование, selenium", "geekjob", "it"),
    ("Программист 1С", "доработка конфигураций", "hh", "it"),
    ("Официант в ресторан", "обслуживание гостей", "hh", "food"),
    ("Повар горячего цеха", "приготовление блюд", "avito", "food"),
    ("Электромонтажник", "монтаж проводки", "avito", "manual"),
    ("Грузчик на склад", "погрузка-разгрузка", "avito", "manual"),
    ("Водитель-курьер", "доставка на авто", "avito", "transport"),
    ("Продавец-консультант", "работа в зале", "hh", "trade"),
    ("Бухгалтер на первичку", "1с, отчётность", "hh", "office_fin"),
    ("Парикмахер-универсал", "стрижки, окрашивание", "avito", "beauty"),
    ("Медсестра процедурного кабинета", "уколы, капельницы", "hh", "med"),
    ("Учитель начальных классов", "работа с детьми", "hh", "edu"),
    ("Охранник в БЦ", "сутки через двое", "avito", "sec_clean"),
    ("Автослесарь", "ремонт ходовой", "avito", "auto"),
]

# Разрешённые кросс-матчи (смежные сферы — это НЕ ошибка):
ALLOWED_CROSS = {
    ("transport","manual"), ("manual","transport"),   # грузчик/кладовщик смежны
    ("sec_clean","manual"), ("other","manual"), ("other","food"),
    ("food","trade"), ("trade","food"),               # кассир/бармен пересекаются
    ("office_fin","trade"),                            # менеджер по продажам
    ("auto","manual"), ("manual","auto"),
    ("med","beauty"), ("beauty","med"),
}

hard_fails = []   # не-IT профиль матчит IT-вакансию — НЕДОПУСТИМО
soft_notes = []   # прочие кросс-доменные матчи — на глаза
own_fails = []    # профиль НЕ матчит вакансию своей сферы с тем же смыслом

OWN_EXPECT = {
    "Официант": "Официант в ресторан", "Повар": "Повар горячего цеха",
    "Электрик": "Электромонтажник", "Грузчик": "Грузчик на склад",
    "Водитель": "Водитель-курьер", "Продавец": "Продавец-консультант",
    "Бухгалтер": "Бухгалтер на первичку", "Парикмахер": "Парикмахер-универсал",
    "Медсестра": "Медсестра процедурного кабинета", "Охранник": "Охранник в БЦ",
    "Автомеханик": "Автослесарь",
    "Python разработчик": "Python разработчик (Telegram бот)",
    "Тестировщик": "QA инженер", "1С программист": "Программист 1С",
}

for sp, sk, psph in PROFILES:
    for title, desc, src, vsph in VACS:
        v = {"title": title, "description": desc, "source": src}
        got = mv(sp, sk, v)
        if got and psph != vsph:
            if vsph == "it" and psph != "it":
                hard_fails.append(f"{sp} ({psph}) × «{title}»")
            elif (psph, vsph) not in ALLOWED_CROSS:
                soft_notes.append(f"{sp} ({psph}) × «{title}» ({vsph})")
    own = OWN_EXPECT.get(sp)
    if own:
        v = next({"title": t, "description": d, "source": s} for t, d, s, _ in VACS if t == own)
        if not mv(sp, sk, v):
            own_fails.append(f"{sp} ✗ «{own}»")

total = len(PROFILES) * len(VACS)
print(f"Профилей: {len(PROFILES)}, вакансий: {len(VACS)}, проверок: {total}")
print(f"\n🟥 HARD (не-IT → IT-вакансия): {len(hard_fails)}")
for f in hard_fails: print("   ", f)
print(f"\n🟨 SOFT (неожиданный кросс-домен): {len(soft_notes)}")
for f in soft_notes[:20]: print("   ", f)
print(f"\n🟦 OWN (свою вакансию не взял): {len(own_fails)}")
for f in own_fails: print("   ", f)
