from typing import Tuple

from .. import Provider as AddressProvider


class Provider(AddressProvider):
    """Address provider for ar_DZ locale."""

    # Source: https://ar.wikipedia.org/wiki/ولايات_الجزائر
    wilayas: Tuple[str, ...] = (
        "أدرار",
        "الشلف",
        "الأغواط",
        "أم البواقي",
        "باتنة",
        "بجاية",
        "بسكرة",
        "بشار",
        "البليدة",
        "البويرة",
        "تمنراست",
        "تبسة",
        "تلمسان",
        "تيارت",
        "تيزي وزو",
        "الجزائر",
        "الجلفة",
        "جيجل",
        "سطيف",
        "سعيدة",
        "سكيكدة",
        "سيدي بلعباس",
        "عنابة",
        "قالمة",
        "قسنطينة",
        "المدية",
        "مستغانم",
        "المسيلة",
        "معسكر",
        "ورقلة",
        "وهران",
        "البيض",
        "إليزي",
        "برج بوعريريج",
        "بومرداس",
        "الطارف",
        "تندوف",
        "تيسمسيلت",
        "الوادي",
        "خنشلة",
        "سوق أهراس",
        "تيبازة",
        "ميلة",
        "عين الدفلى",
        "النعامة",
        "عين تموشنت",
        "غرداية",
        "غليزان",
        "تيميمون",
        "برج باجي مختار",
        "أولاد جلال",
        "بني عباس",
        "عين صالح",
        "عين قزام",
        "تقرت",
        "جانت",
        "المغير",
        "المنيعة",
    )

    # Source: https://github.com/othmanus/algeria-cities
    cities: Tuple[str, ...] = (
        # Wilaya 01 - أدرار
        "أدرار",
        "رقان",
        "أولف",
        "تيميمون",
        # Wilaya 02 - الشلف
        "الشلف",
        "تنس",
        "بوقادير",
        # Wilaya 03 - الأغواط
        "الأغواط",
        "أفلو",
        "عين ماضي",
        # Wilaya 04 - أم البواقي
        "أم البواقي",
        "عين مليلة",
        "عين البيضاء",
        # Wilaya 05 - باتنة
        "باتنة",
        "بريكة",
        "عين التوتة",
        "أريس",
        "نقاوس",
        # Wilaya 06 - بجاية
        "بجاية",
        "أقبو",
        "خراطة",
        "تاكسلانت",
        "أميزور",
        # Wilaya 07 - بسكرة
        "بسكرة",
        "طولقة",
        "سيدي عقبة",
        "زريبة الوادي",
        # Wilaya 08 - بشار
        "بشار",
        "تاغيت",
        "القنادسة",
        # Wilaya 09 - البليدة
        "البليدة",
        "بوفاريك",
        "الأربعاء",
        "بوعينان",
        # Wilaya 10 - البويرة
        "البويرة",
        "سور الغزلان",
        "عين بسام",
        # Wilaya 11 - تمنراست
        "تمنراست",
        "أبلسة",
        # Wilaya 12 - تبسة
        "تبسة",
        "بئر العاتر",
        "الونزة",
        # Wilaya 13 - تلمسان
        "تلمسان",
        "مغنية",
        "الغزوات",
        "ندرومة",
        "مرسى بن مهيدي",
        # Wilaya 14 - تيارت
        "تيارت",
        "السوقر",
        "فرندة",
        "تاقدمت",
        # Wilaya 15 - تيزي وزو
        "تيزي وزو",
        "ذراع بن خدة",
        "أزفون",
        "بوغني",
        "تيقزيرت",
        # Wilaya 16 - الجزائر
        "الجزائر الوسطى",
        "باب الوادي",
        "القصبة",
        "سيدي امحمد",
        "حسين داي",
        "القبة",
        "الحراش",
        "الرويبة",
        "زرالدة",
        "بئر مراد رايس",
        "بوزريعة",
        "الشراقة",
        "الدرارية",
        "باب الزوار",
        "برج الكيفان",
        "الدار البيضاء",
        "عين طاية",
        # Wilaya 17 - الجلفة
        "الجلفة",
        "مسعد",
        "عين وسارة",
        "حاسي بحبح",
        # Wilaya 18 - جيجل
        "جيجل",
        "الطاهير",
        "الميلية",
        "زيامة منصورية",
        # Wilaya 19 - سطيف
        "سطيف",
        "العلمة",
        "جميلة",
        "عين أرنات",
        "قجال",
        # Wilaya 20 - سعيدة
        "سعيدة",
        "عين الحجر",
        # Wilaya 21 - سكيكدة
        "سكيكدة",
        "عزابة",
        "الحروش",
        "القل",
        # Wilaya 22 - سيدي بلعباس
        "سيدي بلعباس",
        "عين البرد",
        "مرحوم",
        "تلموني",
        # Wilaya 23 - عنابة
        "عنابة",
        "البوني",
        "عين الباردة",
        "سيدي عمار",
        # Wilaya 24 - قالمة
        "قالمة",
        "بومهرة أحمد",
        "حمام النبايل",
        # Wilaya 25 - قسنطينة
        "قسنطينة",
        "الخروب",
        "ديدوش مراد",
        "زيغود يوسف",
        "عين عبيد",
        # Wilaya 26 - المدية
        "المدية",
        "قصر البخاري",
        "البرواقية",
        "بوغار",
        # Wilaya 27 - مستغانم
        "مستغانم",
        "سيدي علي",
        "عين تادلس",
        "مزغران",
        # Wilaya 28 - المسيلة
        "المسيلة",
        "بوسعادة",
        "سيدي عيسى",
        "عين الملح",
        # Wilaya 29 - معسكر
        "معسكر",
        "تيغنيف",
        "بوحنيفية",
        "سيق",
        # Wilaya 30 - ورقلة
        "ورقلة",
        "حاسي مسعود",
        "عين البيضاء",
        # Wilaya 31 - وهران
        "وهران",
        "أرزيو",
        "عين الترك",
        "بئر الجير",
        "مرسى الحجاج",
        "السانية",
        # Wilaya 32 - البيض
        "البيض",
        "بريزينة",
        # Wilaya 33 - إليزي
        "إيليزي",
        "إن أمناس",
        # Wilaya 34 - برج بوعريريج
        "برج بوعريرج",
        "رأس الوادي",
        "ثنية النصر",
        # Wilaya 35 - بومرداس
        "بومرداس",
        "خميس الخشنة",
        "برج منايل",
        "دلس",
        # Wilaya 36 - الطارف
        "الطارف",
        "القالة",
        "بن مهيدي",
        # Wilaya 37 - تندوف
        "تندوف",
        # Wilaya 38 - تيسمسيلت
        "تيسمسيلت",
        "خميستي",
        # Wilaya 39 - الوادي
        "الوادي",
        "قمار",
        "حاسي خليفة",
        "الرقيبة",
        # Wilaya 40 - خنشلة
        "خنشلة",
        "بابار",
        # Wilaya 41 - سوق أهراس
        "سوق أهراس",
        "مداوروش",
        "سدراتة",
        # Wilaya 42 - تيبازة
        "تيبازة",
        "شرشال",
        "بواسماعيل",
        "القليعة",
        # Wilaya 43 - ميلة
        "ميلة",
        "فرجيوة",
        "شلغوم العيد",
        # Wilaya 44 - عين الدفلى
        "عين الدفلى",
        "خميس مليانة",
        "العطاف",
        "مليانة",
        # Wilaya 45 - النعامة
        "النعامة",
        "المشرية",
        "عين الصفراء",
        # Wilaya 46 - عين تموشنت
        "عين تموشنت",
        "بني صاف",
        "حمام بوحجر",
        # Wilaya 47 - غرداية
        "غرداية",
        "القرارة",
        "متليلي",
        "العطف",
        # Wilaya 48 - غليزان
        "غليزان",
        "مازونة",
        "عمي موسى",
        # New wilayas (49–58)
        "تيميمون",
        "برج باجي مختار",
        "أولاد جلال",
        "بني عباس",
        "عين صالح",
        "عين قزام",
        "تقرت",
        "جانت",
        "المغير",
        "المنيعة",
    )

    street_prefixes: Tuple[str, ...] = ("شارع", "نهج", "طريق", "حي", "زنقة", "دوار", "بلدية")

    building_number_formats: Tuple[str, ...] = ("#", "##", "###")

    # Source: https://github.com/othmanus/algeria-cities
    postcode_formats: Tuple[str, ...] = tuple(f"{i:02d}###" for i in range(1, 49))

    street_name_formats: Tuple[str, ...] = (
        "{{street_prefix}} {{last_name}}",
        "{{street_prefix}} {{first_name}} {{last_name}}",
    )

    street_address_formats: Tuple[str, ...] = ("{{building_number}} {{street_name}}",)

    address_formats: Tuple[str, ...] = (
        "{{street_address}} {{city}}",
        "{{street_address}} - {{city}}",
        "{{street_address}} {{city}} {{wilaya}}",
        "{{street_address}} {{city}} - {{wilaya}}",
    )

    def street_prefix(self) -> str:
        return self.random_element(self.street_prefixes)

    def city(self) -> str:
        return self.random_element(self.cities)

    def administrative_unit(self) -> str:
        return self.random_element(self.wilayas)

    wilaya = administrative_unit
