# nepalpy/name/cast.py
import random
from typing import List, Union


CASTES = [
    # Khas-Arya / Hill Caste groups
    "Brahmin", "Bahun", "Chhetri", "Kshetri", "Thakuri", "Sanyasi", "Dashnami", "Rajput",
    # Janajati / Adivasi Janajati (Indigenous groups)
    "Magar", "Tamang", "Gurung", "Rai", "Limbu", "Tharu", "Sherpa", "Bhote", "Sunuwar",
    "Yakthumba", "Dhimal", "Bhujel", "Chepang", "Danuwar", "Darai", "Kumal", "Majhi",
    "Musahar", "Rajbansi", "Satar", "Jhangad", "Meche", "Kisan", "Lhomi", "Thudam",
    "Kusunda", "Hayu", "Raute", "Bankariya", "Baramu", "Topkegola", "Dura", "Walung",
    "Byansi", "Mugali", "Kulung", "Nath", "Gharti", "Bote", "Majhi", "Santhal", "Oraon",
    # Madhesi / Terai groups
    "Yadav", "Teli", "Kurmi", "Kalwar", "Halwai", "Mallah", "Mali", "Kanu", "Hajam",
    "Kewat", "Koiri", "Bing/Binda", "Gaderi/Bhediyar", "Dhanuk", "Chamar", "Musahar",
    "Dom", "Chidimar", "Tatwa", "Batar", "Nurang", "Kahar", "Marwadi", "Bangali",
    "Jain", "Kayastha", "Rajbhar", "Khatwe", "Kori", "Nat", "Panjabi",
    # Dalit groups (Hill & Madhesi)
    "Kami", "Damai", "Sarki", "Badi", "Gaine", "Pariyar", "Vishwakarma", "Sunar",
    "Od", "Chamar/Harijan", "Halkhor", "Kalar", "Kahar", "Dhobi", "Nuniya",
    # Newar sub-groups (often treated separately)
    "Newar", "Shrestha", "Maharjan", "Bajracharya", "Tuladhar", "Sakya", "Manandhar",
    "Karmacharya", "Rajbhandari", "Pradhan", "Amatya",
    # Other / smaller groups
    "Muslim", "Thakali", "Hyolmo", "Jirel", "Lepcha", "Munda", "Khawas", "Pun",
    "Rauniyar", "Baniyan", "Gond", "Karmarong", "Ranatharu", "Rana Tharu",
    # More can be added...
]

# Category mapping (broad official/social categories in Nepal)
# Based on common classifications: Khas-Arya, Janajati, Madhesi, Dalit, Newar, Muslim, etc.
CASTE_CATEGORY_MAP = {
    
    # Khas-Arya
    "Paudel": "Khas-Arya",
    "Poudel": "Khas-Arya",
    "Adhikari": "Khas-Arya",
    "Gautam": "Khas-Arya",
    "Neupane": "Khas-Arya",
    "Khanal": "Khas-Arya",
    "Bhattarai": "Khas-Arya",
    "Subedi": "Khas-Arya",
    "Sapkota": "Khas-Arya",
    "Aryal": "Khas-Arya",
    "Sharma": "Khas-Arya",
    "Acharya": "Khas-Arya",
    "Tripathi": "Khas-Arya",
    "Pokharel": "Khas-Arya",
    "Upreti": "Khas-Arya",
    "Tiwari": "Khas-Arya",
    "Parajuli": "Khas-Arya",
    "Basnet": "Khas-Arya",
    "Thapa": "Khas-Arya",
    "Karki": "Khas-Arya",
    "Rana": "Khas-Arya",
    "Khadka": "Khas-Arya",
    "Bhandari": "Khas-Arya",
    "Budhathoki": "Khas-Arya",
    "Rayamajhi": "Khas-Arya",
    "Pande": "Khas-Arya",
    "Bista": "Khas-Arya",
    "Silwal": "Khas-Arya",
    "Shahi": "Khas-Arya",
    "Chand": "Khas-Arya",
    "Bohora": "Khas-Arya",
    "Kharel": "Khas-Arya",
    "Prasai": "Khas-Arya",
    "Bishta": "Khas-Arya",
    "Mahato": "Khas-Arya",
    "Shrestha": "Khas-Arya",
    "Lama": "Khas-Arya",
    "Rawal": "Khas-Arya",
    "Ranabhat": "Khas-Arya",
    "Khatri": "Khas-Arya",
    "Khatiwada": "Khas-Arya",
    "Baral": "Khas-Arya",
    "Regmi": "Khas-Arya",
    "Rijal": "Khas-Arya",
    "Rimal": "Khas-Arya",
    "Risal": "Khas-Arya",
    "Paneru": "Khas-Arya",
    "Devkota": "Khas-Arya",
    "Ghimire": "Khas-Arya",
    "Bhusal": "Khas-Arya",
    "Chapagain": "Khas-Arya",
    "Chaulagain": "Khas-Arya",
    "Pokhriyal": "Khas-Arya",
    "Baraily": "Khas-Arya",
    "Malla": "Khas-Arya",
    "Sanyasi": "Khas-Arya",
    "Dashnami": "Khas-Arya",
    "Raut": "Khas-Arya",
    "Kunwar": "Khas-Arya",
    "Bohra": "Khas-Arya",
    "Basnyat": "Khas-Arya",
    "Chhetri": "Khas-Arya",
    "Das": "Khas-Arya",
    "Dhakal": "Khas-Arya",
    "Karki": "Khas-Arya",
    "Silpakar": "Khas-Arya",
    "Shrestha": "Khas-Arya",
    "Shrestha": "Khas-Arya",
    "Bam": "Khas-Arya",
    "Bista": "Khas-Arya",
    "Adhikari": "Khas-Arya",
    "Bhattarai": "Khas-Arya",
    "Subba": "Khas-Arya",
    "Pant": "Khas-Arya",
    "Bahadur": "Khas-Arya",
    "Kunwor": "Khas-Arya",
    "Bishta": "Khas-Arya",
    "Silwal": "Khas-Arya",
    "Shrestha": "Khas-Arya",
    "Dhungana": "Khas-Arya",
    "Lamichhane": "Khas-Arya",
    "Khulal": "Khas-Arya",
    "Rokaya": "Khas-Arya",
    "Sthapit": "Khas-Arya",
    "Karki": "Khas-Arya",
    "Dhami": "Khas-Arya",
    "Shahi": "Khas-Arya",
    "Bishta": "Khas-Arya",
    "Khanda": "Khas-Arya",
    "Ranabhat": "Khas-Arya",
    "Kandel": "Khas-Arya",
    "Mahat": "Khas-Arya",
    "Khatri": "Khas-Arya",
    "Chand": "Khas-Arya",
    "Bista": "Khas-Arya",
    "Mahato": "Khas-Arya",
    "Sharma": "Khas-Arya",
    "Joshi": "Khas-Arya",
    


    # Janajati / Adivasi Janajati
    "Joshi Shrestha": "Janajati",
    "Magar": "Janajati",
    "Tamang": "Janajati",
    "Gurung": "Janajati",
    "Rai": "Janajati",
    "Limbu": "Janajati",
    "Tharu": "Janajati",
    "Sherpa": "Janajati",
    "Bhote": "Janajati",
    "Sunuwar": "Janajati",
    "Yakthumba": "Janajati",
    "Dhimal": "Janajati",
    "Bhujel": "Janajati",
    "Chepang": "Janajati",
    "Danuwar": "Janajati",
    "Darai": "Janajati",
    "Kumal": "Janajati",
    "Majhi": "Janajati",
    "Musahar": "Janajati",  # sometimes Dalit-Madhesi overlap
    "Rajbansi": "Janajati",
    "Satar": "Janajati",
    "Jhangad": "Janajati",
    "Meche": "Janajati",
    "Kisan": "Janajati",
    "Lhomi": "Janajati",
    "Thudam": "Janajati",
    "Kusunda": "Janajati",
    "Hayu": "Janajati",
    "Raute": "Janajati",
    "Bankariya": "Janajati",
    "Baramu": "Janajati",
    "Topkegola": "Janajati",
    "Dura": "Janajati",
    "Walung": "Janajati",
    "Byansi": "Janajati",
    "Mugali": "Janajati",
    "Kulung": "Janajati",
    "Nath": "Janajati",
    "Gharti": "Janajati",
    "Newar": "Janajati",
    "Shrestha": "Janajati",
    "Maharjan": "Janajati",
    "Bajracharya": "Janajati",
    "Tuladhar": "Janajati",
    "Sakya": "Janajati",
    "Manandhar": "Janajati",
    "Pradhan": "Janajati",
    "Malla": "Janajati",
    "Kansakar": "Janajati",
    "Tamrakar": "Janajati",
    "Ranjitkar": "Janajati",
    "Chitrakar": "Janajati",
    "Silpakar": "Janajati",
    "Shilpakar": "Janajati",
    "Sthapit": "Janajati",
    "Awasthi": "Janajati",
    "Rajopadhyaya": "Janajati",
    "Vaidya": "Janajati",
    "Tandukar": "Janajati",
    "Makaju": "Janajati",
    "Kapali": "Janajati",
    "Napit": "Janajati",
    "Nakarmi": "Janajati",
    "Kumale": "Janajati",
    "Maskey": "Janajati",
    "Mulmi": "Janajati",
    "Munankarmi": "Janajati",
    "Chipā": "Janajati",
    "Putwar": "Janajati",
    "Prajapati": "Janajati",
    "Basukala": "Janajati",
    "Dhobi": "Janajati",
    "Jogi": "Janajati",
    "Kulu": "Janajati",
    "Sayami": "Janajati",
    "Pahari": "Janajati",
    "Shuvar": "Janajati",
    "Lakhé": "Janajati",
    "Rajbhandari": "Janajati",
    "Rajvanshi": "Janajati",
    "Rāwal": "Janajati",
    "Rajkool": "Janajati",
    "Timilā": "Janajati",
    "Mulépati": "Janajati",
    "Amatya": "Janajati",
    "Awal": "Janajati",
    "Balla": "Janajati",
    "Barahi": "Janajati",
    "Baidhya": "Janajati",
    "Bataju": "Janajati",
    "Balami": "Janajati",
    "Bhaila": "Janajati",
    "Bhele": "Janajati",
    "Bhakhuche": "Janajati",
    "Bhuju": "Janajati",
    "Bijukche": "Janajati",
    "Byanju": "Janajati",
    "Chyamey": "Janajati",
    "Chyami": "Janajati",
    "Chuke": "Janajati",
    "Chaguthi": "Janajati",
    "Chikanbanjar": "Janajati",
    "Chhusyabaga": "Janajati",
    "Chandrahar": "Janajati",
    "Chhukan": "Janajati",
    "Dhewaju": "Janajati",
    "Dwa": "Janajati",
    "Dhuju": "Janajati",
    "Deshar": "Janajati",
    "Dhanbanjar": "Janajati",
    "Daware": "Janajati",
    "Duwal": "Janajati",
    "Dhoubanjar": "Janajati",
    "Dhoju": "Janajati",
    "Desemaru": "Janajati",
    "Gubhaju": "Janajati",
    "Sainju": "Janajati",
    "Pode": "Janajati",
    "Sangol": "Janajati",
    "Nagarkoti": "Janajati",
    "Kasaju": "Janajati",
    "Rajthala": "Janajati",
    "Kashichhawa": "Janajati",
    "Singh": "Janajati",
    "Khadgi": "Janajati",
    "Gopali": "Janajati",
    "Phaiju": "Janajati",
    "Malakar": "Janajati",
    "Karmacharya": "Janajati",
    "Palanchoke": "Janajati",
    "Chhunju": "Janajati",
    "Kasaa": "Janajati",
    "Jati": "Janajati",
    "Juwa": "Janajati",
    "Kibanaya": "Janajati",
    "Koju": "Janajati",
    "Konga": "Janajati",
    "Ghodaju": "Janajati",
    "Guvaju": "Janajati",
    "Gwachha": "Janajati",
    "Jakibanjar": "Janajati",
    "Khimbanjar": "Janajati",
    "Khaiju": "Janajati",
    "Khaitu": "Janajati",
    "Sapu": "Janajati",
    "Suwal": "Janajati",
    "Bammala": "Janajati",



    # Madhesi / Terai Caste Groups
    "Yadav": "Madhesi",
    "Teli": "Madhesi",
    "Kurmi": "Madhesi",
    "Kalwar": "Madhesi",
    "Halwai": "Madhesi",
    "Mallah": "Madhesi",
    "Mali": "Madhesi",
    "Kanu": "Madhesi",
    "Hajam": "Madhesi",
    "Kewat": "Madhesi",
    "Koiri": "Madhesi",
    "Bing": "Madhesi",
    "Gaderi": "Madhesi",
    "Dhanuk": "Madhesi",
    "Rajbhar": "Madhesi",
    "Khatwe": "Madhesi",
    "Kori": "Madhesi",
    "Nat": "Madhesi",
    "Panjabi": "Madhesi",
    "Marwadi": "Madhesi",
    "Bangali": "Madhesi",
    "Jain": "Madhesi",
    "Kayastha": "Madhesi",

    # Dalit
    "Kami": "Dalit",
    "Damai": "Dalit",
    "Sarki": "Dalit",
    "Sunar": "Dalit",
    "Lohar": "Dalit",
    "Tamang Kami": "Dalit",
    "Chamar": "Dalit",
    "Musahar": "Dalit",
    "Dom": "Dalit",
    "Dhobi": "Dalit",
    "Badi": "Dalit",
    "Gaine": "Dalit",
    "Khadgi": "Dalit",
    "Pode": "Dalit",
    "Chyame": "Dalit",
    "Chyami": "Dalit",
    "Halkhor": "Dalit",
    "Mehtar": "Dalit",
    "Kulu": "Dalit",
    "Jogi": "Dalit",
    "Kasai": "Dalit",
    "Khatik": "Dalit",
    "Paswan": "Dalit",
    "Rishidev": "Dalit",
    "Das": "Dalit",
    "Harijan": "Dalit",
    "Dusar": "Dalit",
    "Bantar": "Dalit",
    "Teli (Dalit group)": "Dalit",
    "Kol": "Dalit",
    "Chidimar": "Dalit",
    "Pasi": "Dalit",
    "Bind": "Dalit",
    "Kahar": "Dalit",
    "Nat": "Dalit",
    "Dhangar (Dalit group)": "Dalit",
    "Majhi Dom": "Dalit",
    "Thathera": "Dalit",
    "Basor": "Dalit",
    "Pattharkatta": "Dalit",
    "Bhuiyan": "Dalit",
    "Bishwokarma": "Dalit",

    

    # Others
    "Thami":"Thami",
    "Muslim": "Muslim",
    "Thakali": "Thakali",
    "Hyolmo": "Janajati",
    "Jirel": "Janajati",
    "Lepcha": "Janajati",
}

def cast(count: int = 1) -> Union[str, List[str]]:
    if count == 1:
        return random.choice(CASTES)
    else:
        return random.sample(CASTES, min(count, len(CASTES)))


def cast_category(caste_name: str) -> str:
    # Normalize input (title case, strip spaces)
    key = caste_name.strip().title()
    return CASTE_CATEGORY_MAP.get(key, "Unknown / Not classified")