"""
Tests for bys_new bot
"""

from __future__ import annotations

import pytest
from load_one_data import dump_diff, one_dump_test

from ArWikiCats.new_resolvers.bys_new import resolve_by_labels

BY_TABLE_BASED = {
    # all keys with " and "
    "by state and year": "حسب الولاية والسنة",
    "by populated place and occupation": "حسب المكان المأهول والمهنة",
    "by occupation and continent": "حسب المهنة والقارة",
    "by nation and year": "حسب الموطن والسنة",
    "by ethnic or national origin and occupation": "حسب الأصل العرقي أو الوطني والمهنة",
    "by continent and occupation": "حسب القارة والمهنة",
    "by country and city": "حسب البلد والمدينة",
    "by country and occupation": "حسب البلد والمهنة",
    "by country and war": "حسب البلد والحرب",
    # all keys with " or "
    "by university or college": "حسب الجامعة أو الكلية",
    "by territory or dependency": "حسب الإقليم أو التبعية",
    "by state or union territory": "حسب الولاية أو الإقليم الاتحادي",
    "by province or territory": "حسب المقاطعة أو الإقليم",
    "by ethnic or national origin": "حسب الأصل العرقي أو الوطني",
    "by faith or belief": "حسب الإيمان أو العقيدة",
    "by country or language": "حسب البلد أو اللغة",
    "by club or team": "حسب النادي أو الفريق",
    "by city or town": "حسب المدينة أو البلدة",
    "by division or state": "حسب المقاطعة أو الولاية",
    "by state or division": "حسب الولاية أو المقاطعة",
    # all keys with " of "
    "by year of completion": "حسب سنة الانتهاء",
    "by year of conclusion": "حسب سنة الإبرام",
    "by year of entry into force": "حسب سنة دخولها حيز التنفيذ",
    "by year of introduction": "حسب سنة الاستحداث",
    "by year of photographing": "حسب سنة التصوير",
    "by type of words": "حسب نوع الكلمات",
    "by region of area studies": "حسب منطقة الدراسات",
    "by period of setting": "حسب حقبة الأحداث",
    "by period of time": "حسب الفترة الزمنية",
    "by legislative term of office": "حسب الفترة التشريعية للمنصب",
    "by field of research": "حسب مجال البحث",
    "by decade of introduction": "حسب عقد الاستحداث",
    "by continent of production": "حسب قارة الإنتاج",
    "by country of arrest": "حسب بلد الاعتقال",
    "by country of origin": "حسب البلد الأصل",
    "by country of production": "حسب بلد الإنتاج",
    "by country of residence": "حسب بلد الإقامة",
    "by year of closing": "حسب سنة الاغلاق",
    "by decade of closing": "حسب عقد الاغلاق",
    "by century of closing": "حسب قرن الاغلاق",
    "by body of water": "حسب المسطح المائي",
    "by cause of death": "حسب سبب الوفاة",
    "by city of setting": "حسب مدينة الأحداث",
    "by country of setting": "حسب بلد الأحداث",
    "by continent of setting": "حسب قارة الأحداث",
    "by country of location": "حسب بلد الموقع",
    "by city of shooting location": "حسب مدينة موقع التصوير",
    "by city of location": "حسب مدينة الموقع",
    "by period of setting location": "حسب حقبة موقع الأحداث",
    "by continent of shooting location": "حسب قارة موقع التصوير",
    "by country of setting location": "حسب بلد موقع الأحداث",
    "by country of shooting location": "حسب بلد موقع التصوير",
    "by national amateur team": "حسب المنتخب الوطني للهواة",
    "by national men's amateur team": "حسب المنتخب الوطني للهواة للرجال",
    "by national men's team": "حسب منتخب الرجال الوطني",
    "by national team": "حسب المنتخب الوطني",
    "by men's a' national team": "حسب منتخب المحليين",
    "by men's b national team": "حسب المنتخب الرديف",
    "by men's amateur national team": "حسب المنتخب الوطني للهواة للرجال",
    "by amateur national team": "حسب المنتخب الوطني للهواة",
    "by women's amateur national team": "حسب المنتخب الوطني للهواة للسيدات",
    "by youth national team": "حسب المنتخب الوطني للشباب",
    "by national women's amateur team": "حسب المنتخب الوطني للهواة للسيدات",
    "by national women's team": "حسب منتخب السيدات الوطني",
    "by national youth team": "حسب المنتخب الوطني للشباب",
    "by home video label": "حسب علامة الفيديو المنزلي",
    "by color process": "حسب عملية التلوين",
    "by shooting location": "حسب موقع التصوير",
    "by production location": "حسب موقع الإنتاج",
    "by commune": "حسب البلدية",
    "by academic discipline": "حسب التخصص الأكاديمي",
    "by administrative subdivisions": "حسب التقسيم الإداري",
    "by administrative unit": "حسب الوحدة الإدارية",
    "by age category": "حسب تصنيف العمر",
    "by airline": "حسب شركة الطيران",
    "by architectural style": "حسب الطراز المعماري",
    "by artist nationality": "حسب جنسية الفنان",
    "by artist": "حسب الفنان",
    "by association": "حسب الجمعية",
    "by athletic event": "حسب حدث ألعاب القوى",
    "by audience": "حسب الجمهور",
    "by autonomous community": "حسب الحكم الذاتي",
    "by award": "حسب الجائزة",
    "by basin": "حسب الحوض",
    "by belief": "حسب العقيدة",
    "by belligerent party": "حسب الطرف المحارب",
    "by borough": "حسب البلدة",
    "by branch": "حسب الفرع",
    "by brand": "حسب العلامة التجارية",
    "by builder": "حسب الباني",
    "by cemetery": "حسب المقبرة",
    "by census-designated place": "حسب المكان المخصص للتعداد",
    "by century": "حسب القرن",
    "by channel": "حسب القناة",
    "by city": "حسب المدينة",
    "by class": "حسب الصنف",
    "by closing year": "حسب سنة الاغلاق",
    "by club": "حسب النادي",
    "by color": "حسب اللون",
    "by community": "حسب المجتمع",
    "by competition won": "حسب المنافسة التي فازوا بها",
    "by competition": "حسب المنافسة",
    "by composer nationality": "حسب جنسية الملحن",
    "by composer": "حسب الملحن",
    "by congress": "حسب الكونغرس",
    "by constituency": "حسب الدائرة",
    "by continent": "حسب القارة",
    "by country invaded": "حسب البلد المغزو",
    "by country subdivision": "حسب تقسيم البلد",
    "by country subdivisions": "حسب تقسيمات البلد",
    "by country": "حسب البلد",
    "by country-of-residence": "حسب بلد الإقامة",
    "by county": "حسب المقاطعة",
    "by criminal charge": "حسب التهمة الجنائية",
    "by criminal conviction": "حسب الإدانة الجنائية",
    "by culture": "حسب الثقافة",
    "by date": "حسب التاريخ",
    "by day": "حسب اليوم",
    "by decade": "حسب العقد",
    "by defunct club": "حسب النادي السابق",
    "by defunct competition": "حسب المنافسة السابقة",
    "by department": "حسب القسم",
    "by dependent territory": "حسب الأقاليم التابعة",
    "by descent": "حسب الأصل",
    "by designer": "حسب المصمم",
    "by destination country": "حسب بلد الوجهة",
    "by destination language": "حسب اللغة المترجم إليها",
    "by destination": "حسب الوجهة",
    "by detaining country": "حسب بلد الأسر",
    "by diocese": "حسب الأبرشية",
    "by director": "حسب المخرج",
    "by document": "حسب الوثيقة",
    "by educational affiliation": "حسب الانتماء التعليمي",
    "by educational institution": "حسب الهيئة التعليمية",
    "by election": "حسب الانتخابات",
    "by era": "حسب العصر",
    "by ethnicity": "حسب المجموعة العرقية",
    "by event": "حسب الحدث",
    "by faith": "حسب الإيمان",
    "by field": "حسب المجال",
    "by first-level administrative country subdivision": "حسب تقسيمات البلدان من المستوى الأول",
    "by format": "حسب التنسيق",
    "by former country": "حسب البلد السابق",
    "by french title": "حسب العنوان الفرنسي",
    "by gender": "حسب الجنس",
    "by genre": "حسب النوع الفني",
    "by geographic setting": "حسب الموقع الجغرافي للأحداث",
    "by geographical categorization": "حسب التصنيف الجغرافي",
    "by governorate": "حسب المحافظة",
    "by hamlet": "حسب القرية",
    "by height": "حسب الارتفاع",
    "by heritage register": "حسب سجل التراث",
    "by high school": "حسب المدرسة الثانوية",
    "by host country": "حسب البلد المضيف",
    "by host": "حسب المضيف",
    "by ideology": "حسب الأيديولوجية",
    "by industry": "حسب الصناعة",
    "by instrument": "حسب الآلة",
    "by interest": "حسب الاهتمام",
    "by invading country": "حسب البلد الغازي",
    "by invention": "حسب الاختراع",
    "by island": "حسب الجزيرة",
    "by issue": "حسب القضية",
    "by jurisdiction": "حسب الاختصاص القضائي",
    "by lake": "حسب البحيرة",
    "by language family": "حسب العائلة اللغوية",
    "by language": "حسب اللغة",
    "by league representative team": "حسب فريق ممثل الدوري",
    "by lenght": "حسب الطول",
    "by length": "حسب الطول",
    "by line": "حسب الخط",
    "by livery": "حسب الكسوة",
    "by location": "حسب الموقع",
    "by manufacturer nationality": "حسب جنسية الصانع",
    "by manufacturer": "حسب الصانع",
    "by material": "حسب المادة",
    "by medium by nationality": "حسب الوسط حسب الجنسية",
    "by medium": "حسب الوسط",
    "by millennium": "حسب الألفية",
    "by mission country": "حسب بلد البعثة",
    "by month": "حسب الشهر",
    "by movement": "حسب الحركة",
    "by municipality": "حسب البلدية",
    "by museum": "حسب المتحف",
    "by music genre": "حسب نوع الموسيقى",
    "by musician": "حسب الموسيقي",
    "by name": "حسب الإسم",
    "by nation": "حسب الموطن",
    "by nationality": "حسب الجنسية",
    "by network": "حسب شبكة البث",
    "by occupation": "حسب المهنة",
    "by occupied country": "حسب البلد المحتل",
    "by occupying country": "حسب بلد الاحتلال",
    "by operator": "حسب المشغل",
    "by organizer": "حسب المنظم",
    "by parish": "حسب الأبرشية",
    "by party": "حسب الحزب",
    "by patron saint": "حسب الراعي المقدس",
    "by period": "حسب الحقبة",
    "by perpetrator": "حسب مرتكب الجريمة",
    "by person": "حسب الشخص",
    "by place": "حسب المكان",
    "by political orientation": "حسب التوجه السياسي",
    "by political party": "حسب الحزب السياسي",
    "by populated place": "حسب المكان المأهول",
    "by portfolio": "حسب الحقيبة الوزارية",
    "by position": "حسب المركز",
    "by prefecture": "حسب الولاية",
    "by presidential administration": "حسب الإدارة الرئاسية",
    "by professional league": "حسب دوري المحترفين",
    "by propellant": "حسب المادة الدافعة",
    "by province": "حسب المقاطعة",
    "by range": "حسب النطاق",
    "by receiving country": "حسب البلد المستضيف",
    "by region": "حسب المنطقة",
    "by religion": "حسب الدين",
    "by reserve team": "حسب الفريق الاحتياطي",
    "by route": "حسب الطريق",
    "by school": "حسب المدرسة",
    "by script": "حسب النص",
    "by sea": "حسب البحر",
    "by season": "حسب الموسم",
    "by sending country": "حسب البلد المرسل",
    "by series": "حسب السلسلة",
    "by shape": "حسب الشكل",
    "by source": "حسب المصدر",
    "by south korean band": "حسب الفرقة الكورية الجنوبية",
    "by specialism": "حسب النشاط",
    "by specialty": "حسب التخصص",
    "by sport": "حسب الرياضة",
    "by sports event": "حسب الحدث الرياضي",
    "by state": "حسب الولاية",
    "by strength": "حسب القوة",
    "by studio": "حسب استوديو الإنتاج",
    "by subdivision": "حسب التقسيم",
    "by subfield": "حسب الحقل الفرعي",
    "by subgenre": "حسب النوع الفرعي",
    "by subject area": "حسب مجال الموضوع",
    "by subject": "حسب الموضوع",
    "by taxon": "حسب الأصنوفة",
    "by team": "حسب الفريق",
    "by technique": "حسب التقنية",  # not تقانة
    "by technology": "حسب التقانة",
    "by term": "حسب الفترة",
    "by theatre": "حسب المسرح",
    "by time": "حسب الوقت",
    "by topic": "حسب الموضوع",
    "by tour": "حسب البطولة",
    "by tournament": "حسب البطولة",
    "by town": "حسب البلدة",
    "by township": "حسب ضواحي المدن",
    "by track": "حسب المسار",
    "by type": "حسب الفئة",
    "by u.s. state": "حسب الولاية الأمريكية",
    "by unincorporated community": "حسب المجتمع غير المدمج",
    "by union territory": "حسب الإقليم الاتحادي",
    "by university": "حسب الجامعة",
    "by user": "حسب المستخدم",
    "by village": "حسب القرية",
    "by voice type": "حسب نوع الصوت",
    "by voivodeship": "حسب الفويفود",
    "by war": "حسب الحرب",
    "by weight class": "حسب فئة الوزن",
    "by writer nationality": "حسب جنسية الكاتب",
    "by writer": "حسب الكاتب",
    "by year": "حسب السنة",
    "by zoo name": "حسب اسم الحديقة",
    "by opening decade": "حسب عقد الافتتاح",
    "by opening year": "حسب سنة الافتتاح",
}

test_data = {
    "by seniority": "حسب الأقدمية",
    "by producer": "حسب المنتج",
    "by software": "حسب البرمجيات",
    "by band": "حسب الفرقة",
    "by nationality and instrument": "حسب الجنسية والآلة",
    "by country of origin": "حسب البلد الأصل",
    "by year of entry into force": "حسب سنة دخولها حيز التنفيذ",
    "by year of entry into force or country of origin": "حسب سنة دخولها حيز التنفيذ أو البلد الأصل",
    "by nationality, genre and instrument": "حسب الجنسية والنوع والآلة",
    "by instrument, genre and nationality": "حسب الآلة والنوع الفني والجنسية",
    "by genre, nationality and instrument": "حسب النوع الفني والجنسية والآلة",
    "by country of origin or college": "حسب البلد الأصل أو الكلية",
    "by university or college": "حسب الجامعة أو الكلية",
    "by territory or dependency": "حسب الإقليم أو التبعية",
    "by state or division": "حسب الولاية أو المقاطعة",
    "by state or union territory": "حسب الولاية أو الإقليم الاتحادي",
    "by province": "حسب المقاطعة",
    "by territory": "حسب الإقليم",
    "by province or territory": "حسب المقاطعة أو الإقليم",
    "by faith or belief": "حسب الإيمان أو العقيدة",
    "by division or state": "حسب المقاطعة أو الولاية",
    "by ethnic or national origin": "حسب الأصل العرقي أو الوطني",
    "by country or language": "حسب البلد أو اللغة",
    "by city or town": "حسب المدينة أو البلدة",
    "by ethnic or national origin and occupation": "حسب الأصل العرقي أو الوطني والمهنة",
    "by state and year": "حسب الولاية والسنة",
    "by nation and year": "حسب الموطن والسنة",
    "by nationality and instrument ": "حسب الجنسية والآلة",
    "by occupation and continent": "حسب المهنة والقارة",
    "by populated place and occupation": "حسب المكان المأهول والمهنة",
    "by instrument and genre": "حسب الآلة والنوع الفني",
    "by instrument and nationality": "حسب الآلة والجنسية",
    "by genre and instrument": "حسب النوع الفني والآلة",
    "by country and city": "حسب البلد والمدينة",
    "by country and occupation": "حسب البلد والمهنة",
    "by country and war": "حسب البلد والحرب",
    "by continent and occupation": "حسب القارة والمهنة",
    "by century and instrument": "حسب القرن والآلة",
    "by year of closing": "حسب سنة الاغلاق",
    "by year of completion": "حسب سنة الانتهاء",
    "by year of conclusion": "حسب سنة الإبرام",
    "by year of introduction": "حسب سنة الاستحداث",
    "by year of photographing": "حسب سنة التصوير",
    "by decade of closing": "حسب عقد الاغلاق",
    "by decade of introduction": "حسب عقد الاستحداث",
    "by country of arrest": "حسب بلد الاعتقال",
    "by country of location": "حسب بلد الموقع",
    "by country of production": "حسب بلد الإنتاج",
    "by country of residence": "حسب بلد الإقامة",
    "by country of setting": "حسب بلد الأحداث",
    "by country of setting location": "حسب بلد موقع الأحداث",
    "by country of shooting location": "حسب بلد موقع التصوير",
    "by continent of production": "حسب قارة الإنتاج",
    "by continent of setting": "حسب قارة الأحداث",
    "by continent of shooting location": "حسب قارة موقع التصوير",
    "by century of closing": "حسب قرن الاغلاق",
    "by city of location": "حسب مدينة الموقع",
    "by city of setting": "حسب مدينة الأحداث",
    "by city of shooting location": "حسب مدينة موقع التصوير",
    "by club or team": "حسب النادي أو الفريق",
}


@pytest.mark.parametrize("category,expected", test_data.items(), ids=test_data.keys())
@pytest.mark.fast
def test_bys_new_or_and_by(category: str, expected: str, monkeypatch: pytest.MonkeyPatch) -> None:
    """Test all nat translation patterns."""
    to_find_new = {
        "by country of origin": "حسب البلد الأصل",
        "by year of entry into force": "حسب سنة دخولها حيز التنفيذ",
        "by nationality, genre and instrument": "حسب الجنسية والنوع والآلة",
        "by instrument, genre and nationality": "حسب الآلة والنوع الفني والجنسية",
        "by genre, nationality and instrument": "حسب النوع الفني والجنسية والآلة",
    }
    # monkeypatch.setattr("ArWikiCats.new_resolvers.bys_new.data_to_find", to_find_new)
    result = resolve_by_labels(category)
    assert result == expected


@pytest.mark.parametrize("category,expected", BY_TABLE_BASED.items(), ids=BY_TABLE_BASED.keys())
@pytest.mark.fast
def test_by_table_based(category: str, expected: str) -> None:
    """Test all nat translation patterns."""
    result = resolve_by_labels(category)
    assert result == expected


to_test = [
    ("test_bys_new_or_and_by", test_data),
]


@pytest.mark.parametrize("name,data", to_test)
@pytest.mark.dump
def test_dump_all(name: str, data: dict[str, str]) -> None:
    expected, diff_result = one_dump_test(data, resolve_by_labels)
    dump_diff(diff_result, name)

    expected2 = {x: v for x, v in expected.items() if v and x in diff_result}
    dump_diff(expected2, f"{name}_expected")

    assert diff_result == expected, f"Differences found: {len(diff_result):,}, len all :{len(data):,}"
