"""
Тесты scanner.py — scan_regex, _next_token.

Запуск: python3 tests/test_scanner.py
"""

import sys
import os

sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from drhider.scanner import scan_regex, _next_token

passed = 0
failed = 0

def check(name, condition):
    global passed, failed
    if condition:
        passed += 1
        print(f"  ✅ {name}")
    else:
        failed += 1
        print(f"  ❌ {name}")


# ═══════════════════════════════════════════════════════════════
# _next_token
# ═══════════════════════════════════════════════════════════════
print("\n=== _next_token ===")

counters = {}

# 1. Базовый токен
token = _next_token("person_name", counters)
check("person → Иванов/Петров/etc", token.endswith("_0001"))
check("счётчик увеличился", counters.get("person_Иванов", 0) == 1 or any(v == 1 for v in counters.values()))

# 2. Второй токен того же типа — новый номер
token2 = _next_token("person_name", counters)
check("второй person — новый счётчик", any(v >= 1 for v in counters.values()))

# 3. Разные типы — разные счётчики
token3 = _next_token("company", counters)
check("company ≠ person", token3 != token)

# 4. Неизвестный тип → fallback
counters2 = {}
token4 = _next_token("unknown_xyz", counters2)
check("неизвестный тип — Данные_0001", token4.startswith("Данные_") and "_0001" in token4)

# 5. phone
counters3 = {}
token5 = _next_token("phone", counters3)
check("phone — +7_000_000_0001", token5 == "+7_000_000_0001")

# 6. address
counters4 = {}
token6 = _next_token("address", counters4)
check("address — город_0001", token6.endswith("_0001") and len(token6) > 5)


# ═══════════════════════════════════════════════════════════════
# scan_regex
# ═══════════════════════════════════════════════════════════════
print("\n=== scan_regex ===")

# 1. Телефон
mapping = {}
counters = {}
scan_regex("Звоните +7 (495) 789-41-35", mapping, counters)
check("телефон найден", len(mapping) == 1)
check("телефон — токен", list(mapping.values())[0].startswith("+7_000_000_"))

# 2. Email
mapping = {}
counters = {}
scan_regex("Пишите на info@nubes.ru", mapping, counters)
check("email найден", len(mapping) == 1)
check("email — токен", list(mapping.values())[0].startswith("email_"))

# 3. ИНН
mapping = {}
counters = {}
scan_regex("ИНН 9706005293", mapping, counters)
check("ИНН найден", len(mapping) == 1)
check("ИНН — токен", list(mapping.values())[0].startswith("ИНН_"))

# 4. Компания
mapping = {}
counters = {}
scan_regex('ООО "Ромашка" заключила договор', mapping, counters)
check("компания найдена", len(mapping) == 1)
check("компания — токен", "_" in list(mapping.values())[0])

# 5. ФИО
mapping = {}
counters = {}
scan_regex("Директор Иванов И.И. подписал", mapping, counters)
check("ФИО найдено", len(mapping) == 1)
check("ФИО — токен", "_" in list(mapping.values())[0])

# 6. Множественные сущности
mapping = {}
counters = {}
scan_regex("ИНН 9706005293, КПП 772401001, ОГРН 1207700098759", mapping, counters)
check("три сущности", len(mapping) == 3)

# 7. Дубликаты не перезаписываются
mapping = {}
counters = {}
scan_regex("+7 (495) 789-41-35 и ещё +7 (495) 789-41-35", mapping, counters)
check("дубликат — одна запись", len(mapping) == 1)

# 8. Согласованность: один счётчик
mapping = {}
counters = {}
scan_regex("ИНН 9706005293 и КПП 772401001", mapping, counters)
inn_val = mapping["ИНН 9706005293"]
kpp_val = mapping["КПП 772401001"]
check("ИНН и КПП разные токены", inn_val != kpp_val)


# ═══════════════════════════════════════════════════════════════
print(f"\n{'='*50}")
print(f"Результат: {passed} OK, {failed} FAIL из {passed + failed}")
if failed > 0:
    print("❌ ТЕСТЫ ПРОВАЛЕНЫ")
    sys.exit(1)
else:
    print("✅ ВСЕ ТЕСТЫ ПРОЙДЕНЫ")
