"""
Тесты replacer.py — apply_replacements.

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

import sys
import os

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

from drhider.replacer import apply_replacements

passed = 0
failed = 0

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


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

# 1. Простая замена
text = "Директор Иванов И.И. подписал"
mapping = {"Иванов И.И.": "Иванов_0001"}
keys = sorted(mapping.keys(), key=len, reverse=True)
result = apply_replacements(text, mapping, keys)
check("простая замена", result == "Директор Иванов_0001 подписал")

# 2. Длинное before короткого
text = "ИНН 123456789012 и ИНН 1234567890"
mapping = {"ИНН 123456789012": "ИНН_0001", "ИНН 1234567890": "ИНН_0002"}
keys = sorted(mapping.keys(), key=len, reverse=True)
result = apply_replacements(text, mapping, keys)
check("длинное раньше короткого", "ИНН_0001" in result and "ИНН_0002" in result)
check("12-значный не задет 10-значным", result == "ИНН_0001 и ИНН_0002")

# 3. Границы слова
text = "Email: test@mail.ru написать"
mapping = {"test@mail.ru": "email_0001@fake"}
keys = sorted(mapping.keys(), key=len, reverse=True)
result = apply_replacements(text, mapping, keys)
check("email заменён", "email_0001@fake" in result)

# 4. Множественные замены
text = "Иванов И.И. и Петров А.С. подписали"
mapping = {"Иванов И.И.": "Иванов_0001", "Петров А.С.": "Петров_0002"}
keys = sorted(mapping.keys(), key=len, reverse=True)
result = apply_replacements(text, mapping, keys)
check("две замены", "Иванов_0001" in result and "Петров_0002" in result)

# 5. Спецсимволы в ключе
text = 'ООО "Ромашка" заключила'
mapping = {'ООО "Ромашка"': "ООО_Технология_0001"}
keys = sorted(mapping.keys(), key=len, reverse=True)
result = apply_replacements(text, mapping, keys)
check("кавычки в ключе", "ООО_Технология_0001" in result)

# 6. Кириллица
text = "Москва, ул. Ленина, д. 42"
mapping = {"Москва": "Москва_0001", "Ленина": "Ленина_0015"}
keys = sorted(mapping.keys(), key=len, reverse=True)
result = apply_replacements(text, mapping, keys)
check("кириллица заменена", "Москва_0001" in result and "Ленина_0015" in result)

# 7. Частичное совпадение не заменяется
text = "Ивановский проспект"
mapping = {"Иванов": "Иванов_0001"}
keys = sorted(mapping.keys(), key=len, reverse=True)
result = apply_replacements(text, mapping, keys)
check("частичное совпадение — не заменено", result == "Ивановский проспект")

# 8. Пустой mapping
text = "ничего не меняется"
result = apply_replacements(text, {}, [])
check("пустой mapping", result == text)

# 9. Markdown текст
text = "**ООО Ромашка** заключила с **Иванов И.И.**"
mapping = {"ООО Ромашка": "ООО_Технология_0001", "Иванов И.И.": "Иванов_0002"}
keys = sorted(mapping.keys(), key=len, reverse=True)
result = apply_replacements(text, mapping, keys)
check("Markdown bold сохранён", "**ООО_Технология_0001**" in result)


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