File size: 20,631 Bytes
4f4e064
f536a8a
 
b97cadb
4f4e064
f536a8a
 
4f4e064
f536a8a
 
 
 
 
 
 
 
 
 
 
 
 
4f4e064
b97cadb
 
 
 
 
 
 
 
 
 
 
 
 
725d97d
 
 
 
 
b97cadb
725d97d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b97cadb
 
725d97d
 
b97cadb
725d97d
 
 
 
 
 
 
b97cadb
725d97d
 
 
 
 
 
 
 
 
b97cadb
725d97d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b97cadb
725d97d
 
 
 
 
 
 
 
b97cadb
725d97d
 
 
 
 
 
 
b97cadb
725d97d
 
b97cadb
725d97d
 
 
 
 
b97cadb
725d97d
 
 
b97cadb
725d97d
 
 
 
 
 
b97cadb
725d97d
b97cadb
725d97d
 
b97cadb
725d97d
 
b97cadb
725d97d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b97cadb
725d97d
 
 
 
 
 
 
 
 
 
b97cadb
725d97d
 
 
 
 
 
 
 
 
 
 
 
b97cadb
725d97d
b97cadb
f536a8a
725d97d
f536a8a
b97cadb
f536a8a
 
 
 
 
725d97d
 
b97cadb
725d97d
 
 
 
 
 
b97cadb
725d97d
 
 
 
 
f536a8a
 
 
 
 
 
 
 
 
 
 
b97cadb
725d97d
 
 
 
 
 
 
 
f536a8a
 
725d97d
 
 
 
 
4f4e064
f536a8a
4f4e064
f536a8a
 
 
 
 
725d97d
 
 
 
b97cadb
725d97d
f536a8a
 
 
 
 
b97cadb
 
 
f536a8a
b97cadb
f536a8a
 
b97cadb
725d97d
 
 
 
 
4f4e064
0615894
4f4e064
 
f536a8a
4f4e064
f536a8a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
import gradio as gr
import torch
from transformers import pipeline
import re

# Global variable to store the model
pipe = None

def load_model():
    """Load the Atlas-Chat model"""
    global pipe
    if pipe is None:
        print("🏔️ Loading Atlas-Chat-2B model...")
        pipe = pipeline(
            "text-generation",
            model="MBZUAI-Paris/Atlas-Chat-2B",
            model_kwargs={"torch_dtype": torch.bfloat16},
            device="cuda" if torch.cuda.is_available() else "cpu"
        )
        print("✅ Model loaded successfully!")
    return pipe

def detect_arabizi(text):
    """
    Detect if input text is written in Arabizi (Latin script with numbers)
    Returns True if Arabizi is detected
    """
    if not text or len(text.strip()) < 2:
        return False
    
    # Check for Arabic script - if present, it's NOT Arabizi
    arabic_pattern = r'[\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF\uFB50-\uFDFF\uFE70-\uFEFF]'
    if re.search(arabic_pattern, text):
        return False
    
    # Arabizi indicators - numbers used as letters
    arabizi_numbers = ['2', '3', '7', '9', '5', '6', '8']
    has_arabizi_numbers = any(num in text for num in arabizi_numbers)
    
    # Common Arabizi words and patterns
    arabizi_patterns = [
        'wach', 'wash', 'ach', 'achno', 'chno', 'shno', 'shkoun', 'chkoun',
        'kif', 'kifash', 'ki', 'kayf', 'kien', 'kima',
        'feen', 'fin', 'fen', 'fain', 'mnin',
        'imta', 'meta', 'waqt', 'mata', 'emta',
        'hna', 'ahna', 'ana', 'nta', 'nti', 'ntuma', 'ntouma',
        'howa', 'hiya', 'huma', 'houma', 'hoa', 'hia',
        'had', 'hadchi', 'hada', 'hadi', 'hadou', 'hadouk',
        'bghit', 'bghiti', 'bgha', 'bghina', 'bghitiou',
        'galt', 'galti', 'gal', 'galet', 'galou',
        'rah', 'raha', 'rahi', 'rahom', 'rahin',
        'kan', 'kanu', 'kana', 'kanet', 'kano',
        'ghadi', 'ghad', 'gha', 'ghadia', 'ghadiyin',
        'daba', 'dak', 'dakchi', 'dik', 'dok',
        'bzf', 'bzzaf', 'bezzaf', 'bzaaaaf',
        'chway', 'chwiya', 'shwiya', 'chwia',
        'khoya', 'khuya', 'akhi', 'kho',
        'khti', 'khtiya', 'ukhti', 'kht',
        'mama', 'baba', 'lwaldin', 'lwalidin',
        'salam', 'salamu aleikum', 'slm',
        'yallah', 'yalla', 'hya', 'aji',
        'mabghitsh', 'mabghach', 'makansh', 'machi',
        'walakin', 'walaken', 'ama', 'mais'
    ]
    
    text_lower = text.lower()
    has_arabizi_words = any(pattern in text_lower for pattern in arabizi_patterns)
    
    # Decision logic
    if has_arabizi_numbers and has_arabizi_words:
        return True
    if has_arabizi_numbers and len([c for c in text if c.isalpha()]) > len(text) * 0.6:
        return True
    if has_arabizi_words and len([c for c in text if c.isalpha()]) > len(text) * 0.7:
        return True
    
    return False

def arabizi_to_arabic(text):
    """
    Convert Arabizi text to Arabic script
    COMPLETE HARD-CODED MAPPINGS
    """
    if not text:
        return text
    
    # COMPREHENSIVE WORD MAPPINGS (Arabizi → Arabic)
    word_mappings = {
        # Pronouns
        'ana': 'أنا', 'nta': 'نتا', 'nti': 'نتي', 'howa': 'هوا', 'hiya': 'هيا',
        'hoa': 'هوا', 'hia': 'هيا', 'hna': 'حنا', 'ahna': 'أحنا', 
        'ntuma': 'نتوما', 'ntouma': 'نتوما', 'huma': 'هوما', 'houma': 'هوما',
        
        # Question words  
        'shkoun': 'شكون', 'chkoun': 'شكون', 'skoun': 'شكون',
        'achno': 'أشنو', 'chno': 'شنو', 'shno': 'شنو', 'ach': 'أش',
        'wach': 'واش', 'wash': 'واش', 'ouach': 'واش',
        'kifash': 'كيفاش', 'kif': 'كيف', 'ki': 'كي', 'kayf': 'كيف',
        'feen': 'فين', 'fin': 'فين', 'fen': 'فين', 'fain': 'فين', 'mnin': 'منين',
        'imta': 'إمتا', 'meta': 'متا', 'mata': 'متا', 'emta': 'إمتا',
        '3lach': 'علاش', 'alach': 'علاش', '3la ach': 'علاش',
        
        # Common verbs
        'bghit': 'بغيت', 'bghiti': 'بغيتي', 'bgha': 'بغا', 'bghina': 'بغينا',
        'kan': 'كان', 'kana': 'كانا', 'kanet': 'كانت', 'kanu': 'كانو',
        'galt': 'قلت', 'galti': 'قلتي', 'gal': 'قال', 'galet': 'قالت',
        'galou': 'قالو', 'galina': 'قلنا',
        'rah': 'راح', 'raha': 'راها', 'rahi': 'راهي', 'rahom': 'راهم',
        'ghadi': 'غادي', 'ghad': 'غاد', 'gha': 'غا', 'ghadia': 'غادية',
        'dir': 'دير', 'dert': 'درت', 'derat': 'درات', 'derna': 'درنا',
        'ja': 'جا', 'jat': 'جات', 'jina': 'جينا', 'jaou': 'جاو',
        'mcha': 'مشا', 'mchat': 'مشات', 'mchina': 'مشينا', 'mchaou': 'مشاو',
        'khrj': 'خرج', 'khrja': 'خرجا', 'khrjat': 'خرجات', 'khrjna': 'خرجنا',
        'dkhl': 'دخل', 'dkhla': 'دخلا', 'dkhlat': 'دخلات', 'dkhlna': 'دخلنا',
        
        # Demonstratives
        'had': 'هاد', 'hada': 'هادا', 'hadi': 'هادي', 'hadou': 'هادو',
        'hadouk': 'هادوك', 'hadchi': 'هادشي', 'hadak': 'هاداك',
        'dak': 'داك', 'dik': 'ديك', 'dok': 'دوك', 'dakchi': 'داكشي',
        
        # Prepositions
        'fi': 'في', 'f': 'ف', 'men': 'من', 'mn': 'من', 'l': 'ل', 'li': 'لي',
        'bla': 'بلا', 'b': 'ب', 'bi': 'بي', 'bih': 'بيه', 'biha': 'بيها',
        'mea': 'معا', 'maak': 'معاك', 'maaki': 'معاكي', 'maana': 'معانا',
        'maahom': 'معاهم', 'maaha': 'معاها',
        
        # Numbers
        'wahed': 'واحد', 'joj': 'جوج', 'tlata': 'تلاتا', 'rebaa': 'ربعا',
        'khamsa': 'خمسا', 'setta': 'ستا', 'sebaa': 'سبعا', 'tmanya': 'تمنيا',
        'tesaa': 'تسعا', 'ashra': 'عشرا',
        
        # Time expressions
        'daba': 'دابا', 'tawa': 'توا', 'ghda': 'غدا', 'lbareeh': 'البارح',
        'nhar': 'نهار', 'lila': 'ليلا', 'sbah': 'صباح', 'aachia': 'عشيا',
        
        # Family
        'mama': 'ماما', 'baba': 'بابا', 'khoya': 'خويا', 'khti': 'ختي',
        'khuya': 'خويا', 'khtiya': 'ختيا', 'akhi': 'أخي', 'ukhti': 'أختي',
        'jad': 'جد', 'jada': 'جدا', 'amo': 'عمو', 'ama': 'عما',
        'khal': 'خال', 'khala': 'خالا',
        
        # Adjectives
        'zwin': 'زوين', 'zwina': 'زوينا', 'qbih': 'قبيح', 'qbiha': 'قبيحا',
        'kbir': 'كبير', 'kbira': 'كبيرا', 'sghir': 'صغير', 'sghira': 'صغيرا',
        'tqil': 'تقيل', 'tqila': 'تقيلا', 'khfif': 'خفيف', 'khfifa': 'خفيفا',
        'sahel': 'ساهل', 'sahla': 'ساهلا', 'saab': 'صعب', 'saba': 'صعبا',
        
        # Quantities
        'bzf': 'بزاف', 'bzzaf': 'بزاف', 'bezzaf': 'بزاف', 'ktir': 'كتير',
        'chway': 'شوياة', 'chwiya': 'شوياة', 'shwiya': 'شوياة', 'chwia': 'شوياة',
        'kolchi': 'كولشي', 'kol': 'كول', 'ga': 'غاع', 'gaa': 'غاع',
        'hta': 'حتا', 'walo': 'والو', 'walou': 'والو',
        
        # Negations
        'ma': 'ما', 'machi': 'ماشي', 'mabghitsh': 'مابغيتش', 'makainch': 'ماكاينش',
        'makansh': 'ماكانش', 'maghatch': 'ماغاتش', 'mabaghish': 'مابغيش',
        
        # Conjunctions
        'walakin': 'والاكين', 'walaken': 'والاكين', 'mais': 'ولكن',
        'ama': 'أما', 'ida': 'إذا', 'ila': 'إلا', 'hta': 'حتا',
        'ou': 'أو', 'o': 'أو', 'aw': 'أو', 'wla': 'ولا',
        
        # Expressions
        'salam': 'سلام', 'yallah': 'يالاه', 'yalla': 'يالا', 'hya': 'هيا',
        'aji': 'أجي', 'sir': 'سير', 'siri': 'سيري', 'ajou': 'أجو',
        'mabrook': 'مبروك', 'baraka': 'باركا', 'besaha': 'بصحا',
        'allah': 'الله', 'rabi': 'ربي', 'llah': 'الله',
        'inchallah': 'إن شاء الله', 'machallah': 'ما شاء الله',
        'hamdulillah': 'الحمد لله', 'alhamdulillah': 'الحمد لله',
        'la hawla': 'لا حول', 'astghfirullah': 'أستغفر الله',
        
        # Countries and places
        'lmaghrib': 'المغرب', 'maghrib': 'مغرب', 'casa': 'كازا',
        'rbat': 'الرباط', 'fas': 'فاس', 'mknas': 'مكناس',
        'tanja': 'طنجا', 'agadir': 'أكادير', 'marrakech': 'مراكش',
        
        # Common nouns
        'dar': 'دار', 'bit': 'بيت', 'tomo': 'طوموبيل', 'karhouba': 'كرهوبا',
        'makla': 'ماكلا', 'atay': 'أتاي', 'khobz': 'خوبز', 'lma': 'الما',
        'tajin': 'طاجين', 'tajine': 'طاجين', 'couscous': 'كوسكوس',
        'msemen': 'مسمن', 'rghaif': 'رغايف', 'harira': 'حريرا',
        'khodra': 'خضرا', 'fawakeh': 'فواكه', 'lahem': 'لحم',
        'djaj': 'دجاج', 'hout': 'حوت', 'lben': 'اللبن',
        'skar': 'سكر', 'melh': 'ملح', 'zit': 'زيت', 'zebda': 'زبدا',
        
        # Verbs (additional)
        'chreb': 'شرب', 'chrba': 'شربا', 'chrebat': 'شربات', 'chrebna': 'شربنا',
        'kla': 'كلا', 'klat': 'كلات', 'klina': 'كلينا', 'klaw': 'كلاو',
        'nees': 'نعس', 'neesat': 'نعسات', 'neesna': 'نعسنا', 'neasou': 'نعسو',
        'faq': 'فاق', 'faqat': 'فاقات', 'faqna': 'فقنا', 'faqou': 'فاقو',
        'tlab': 'طلب', 'tlbat': 'طلبات', 'tlabna': 'طلبنا', 'tlabou': 'طلبو',
        'khdam': 'خدم', 'khdmat': 'خدمات', 'khdamna': 'خدمنا', 'khdamou': 'خدمو',
        'qra': 'قرا', 'qrat': 'قرات', 'qrina': 'قرينا', 'qraw': 'قراو',
        'kteb': 'كتب', 'ktbat': 'كتبات', 'ktebna': 'كتبنا', 'ktbou': 'كتبو',
        'chaf': 'شاف', 'chafat': 'شافات', 'chfna': 'شفنا', 'chafou': 'شافو',
        'sma': 'سمع', 'smat': 'سمعات', 'smana': 'سمعنا', 'smaou': 'سمعو'
    }
    
    # CHARACTER MAPPINGS (Arabizi numbers/letters → Arabic)
    char_mappings = {
        '2': 'ء', '3': 'ع', '5': 'خ', '6': 'ط', '7': 'ح', '8': 'غ', '9': 'ق',
        'a': 'ا', 'b': 'ب', 't': 'ت', 'th': 'ث', 'j': 'ج', 'd': 'د',
        'r': 'ر', 'z': 'ز', 's': 'س', 'sh': 'ش', 'f': 'ف', 'k': 'ك',
        'l': 'ل', 'm': 'م', 'n': 'ن', 'h': 'ه', 'w': 'و', 'y': 'ي',
        'aa': 'آ', 'ee': 'ي', 'oo': 'و', 'ou': 'و', 'ai': 'ي', 'ay': 'ي'
    }
    
    # DIGRAPH MAPPINGS (two-letter combinations first)
    digraph_mappings = {
        'kh': 'خ', 'gh': 'غ', 'ch': 'ش', 'th': 'ث', 'dh': 'ذ', 
        'sh': 'ش', 'ts': 'ص', 'dz': 'ض', 'ss': 'ص', 'tt': 'ط',
        'zz': 'ظ', 'aa': 'آ', 'ee': 'ي', 'ii': 'ي', 'oo': 'و', 
        'uu': 'و', 'ou': 'و', 'ai': 'ي', 'ay': 'ي', 'ey': 'ي'
    }
    
    # Convert text
    result = text.lower()
    
    # Step 1: Apply word mappings (most specific first)
    for arabizi_word, arabic_word in word_mappings.items():
        # Use word boundaries to avoid partial matches
        pattern = r'\b' + re.escape(arabizi_word) + r'\b'
        result = re.sub(pattern, arabic_word, result, flags=re.IGNORECASE)
    
    # Step 2: Apply digraph mappings
    for digraph, arabic_char in digraph_mappings.items():
        result = result.replace(digraph, arabic_char)
    
    # Step 3: Apply single character mappings
    for char, arabic_char in char_mappings.items():
        if len(char) == 1:  # Only single chars in this step
            result = result.replace(char, arabic_char)
    
    return result

def arabic_to_arabizi(text):
    """
    Convert Arabic script to Arabizi
    COMPLETE HARD-CODED MAPPINGS
    """
    if not text:
        return text
    
    # COMPREHENSIVE WORD MAPPINGS (Arabic → Arabizi)
    word_mappings = {
        # Pronouns
        'أنا': 'ana', 'نتا': 'nta', 'نتي': 'nti', 'هوا': 'howa', 'هيا': 'hiya',
        'حنا': 'hna', 'أحنا': 'ahna', 'نتوما': 'ntuma', 'هوما': 'huma',
        
        # Question words
        'شكون': 'shkoun', 'أشنو': 'achno', 'شنو': 'chno', 'أش': 'ach',
        'واش': 'wach', 'كيفاش': 'kifash', 'كيف': 'kif', 'فين': 'feen',
        'منين': 'mnin', 'إمتا': 'imta', 'متا': 'meta', 'علاش': '3lach',
        
        # Common verbs
        'بغيت': 'bghit', 'بغيتي': 'bghiti', 'بغا': 'bgha', 'بغينا': 'bghina',
        'كان': 'kan', 'كانا': 'kana', 'كانت': 'kanet', 'كانو': 'kanu',
        'قلت': 'galt', 'قلتي': 'galti', 'قال': 'gal', 'قالت': 'galet',
        'قالو': 'galou', 'قلنا': 'galina',
        'راح': 'rah', 'راها': 'raha', 'راهي': 'rahi', 'راهم': 'rahom',
        'غادي': 'ghadi', 'غاد': 'ghad', 'غا': 'gha', 'غادية': 'ghadia',
        'دير': 'dir', 'درت': 'dert', 'درات': 'derat', 'درنا': 'derna',
        'جا': 'ja', 'جات': 'jat', 'جينا': 'jina', 'جاو': 'jaou',
        'مشا': 'mcha', 'مشات': 'mchat', 'مشينا': 'mchina', 'مشاو': 'mchaou',
        
        # Demonstratives
        'هاد': 'had', 'هادا': 'hada', 'هادي': 'hadi', 'هادو': 'hadou',
        'هادوك': 'hadouk', 'هادشي': 'hadchi', 'هاداك': 'hadak',
        'داك': 'dak', 'ديك': 'dik', 'دوك': 'dok', 'داكشي': 'dakchi',
        
        # Numbers
        'واحد': 'wahed', 'جوج': 'joj', 'تلاتا': 'tlata', 'ربعا': 'rebaa',
        'خمسا': 'khamsa', 'ستا': 'setta', 'سبعا': 'sebaa', 'تمنيا': 'tmanya',
        'تسعا': 'tesaa', 'عشرا': 'ashra',
        
        # Time
        'دابا': 'daba', 'توا': 'tawa', 'غدا': 'ghda', 'البارح': 'lbareeh',
        'نهار': 'nhar', 'ليلا': 'lila', 'صباح': 'sbah', 'عشيا': 'aachia',
        
        # Family
        'ماما': 'mama', 'بابا': 'baba', 'خويا': 'khoya', 'ختي': 'khti',
        'ختيا': 'khtiya', 'أخي': 'akhi', 'أختي': 'ukhti',
        'جد': 'jad', 'جدا': 'jada', 'عمو': 'amo', 'عما': 'ama',
        
        # Adjectives
        'زوين': 'zwin', 'زوينا': 'zwina', 'قبيح': 'qbih', 'قبيحا': 'qbiha',
        'كبير': 'kbir', 'كبيرا': 'kbira', 'صغير': 'sghir', 'صغيرا': 'sghira',
        'تقيل': 'tqil', 'تقيلا': 'tqila', 'خفيف': 'khfif', 'خفيفا': 'khfifa',
        
        # Quantities
        'بزاف': 'bzzaf', 'كتير': 'ktir', 'شوياة': 'chwiya', 'كولشي': 'kolchi',
        'كول': 'kol', 'غاع': 'gaa', 'حتا': 'hta', 'والو': 'walo',
        
        # Negations
        'ما': 'ma', 'ماشي': 'machi', 'مابغيتش': 'mabghitsh', 'ماكاينش': 'makainch',
        'ماكانش': 'makansh', 'ماغاتش': 'maghatch', 'مابغيش': 'mabaghish',
        
        # Expressions
        'سلام': 'salam', 'يالاه': 'yallah', 'يالا': 'yalla', 'هيا': 'hya',
        'أجي': 'aji', 'سير': 'sir', 'سيري': 'siri', 'أجو': 'ajou',
        'مبروك': 'mabrook', 'باركا': 'baraka', 'بصحا': 'besaha',
        'الله': 'allah', 'ربي': 'rabi', 'إن شاء الله': 'inchallah',
        'ما شاء الله': 'machallah', 'الحمد لله': 'hamdulillah',
        
        # Places
        'المغرب': 'lmaghrib', 'مغرب': 'maghrib', 'كازا': 'casa',
        'الرباط': 'rbat', 'فاس': 'fas', 'مكناس': 'mknas',
        'طنجا': 'tanja', 'أكادير': 'agadir', 'مراكش': 'marrakech',
        
        # Food and drinks
        'طاجين': 'tajine', 'كوسكوس': 'couscous', 'مسمن': 'msemen',
        'رغايف': 'rghaif', 'حريرا': 'harira', 'أتاي': 'atay',
        'خوبز': 'khobz', 'الما': 'lma', 'لحم': 'lahem', 'دجاج': 'djaj',
        
        # Common nouns
        'دار': 'dar', 'بيت': 'bit', 'طوموبيل': 'tomo', 'كرهوبا': 'karhouba',
        'ماكلا': 'makla', 'خضرا': 'khodra', 'فواكه': 'fawakeh',
        'حوت': 'hout', 'اللبن': 'lben', 'سكر': 'skar', 'ملح': 'melh'
    }
    
    # CHARACTER MAPPINGS (Arabic → Arabizi)
    char_mappings = {
        'ا': 'a', 'ب': 'b', 'ت': 't', 'ث': 'th', 'ج': 'j', 'ح': '7',
        'خ': 'kh', 'د': 'd', 'ذ': 'dh', 'ر': 'r', 'ز': 'z', 'س': 's',
        'ش': 'sh', 'ص': 's', 'ض': 'd', 'ط': '6', 'ظ': 'z', 'ع': '3',
        'غ': 'gh', 'ف': 'f', 'ق': '9', 'ك': 'k', 'ل': 'l', 'م': 'm',
        'ن': 'n', 'ه': 'h', 'و': 'w', 'ي': 'y', 'ء': '2',
        'آ': 'aa', 'أ': 'a', 'إ': 'i', 'ئ': '2', 'ؤ': 'w2', 'ة': 'a',
        'ى': 'a', 'ً': 'an', 'ٌ': 'on', 'ٍ': 'in', 'َ': 'a', 'ُ': 'o', 'ِ': 'i'
    }
    
    # Convert text
    result = text
    
    # Step 1: Apply word mappings (most specific first)
    for arabic_word, arabizi_word in word_mappings.items():
        # Use word boundaries to avoid partial matches
        pattern = r'\b' + re.escape(arabic_word) + r'\b'
        result = re.sub(pattern, arabizi_word, result)
    
    # Step 2: Apply character mappings
    for arabic_char, arabizi_char in char_mappings.items():
        result = result.replace(arabic_char, arabizi_char)
    
    return result

def chat_with_atlas(message, history):
    """Generate response from Atlas-Chat model with Arabizi conversion"""
    if not message.strip():
        return "مرحبا! أهلا وسهلا. Please enter a message! / Ahlan wa sahlan!"
    
    try:
        # Load model if not already loaded
        model = load_model()
        
        # Detect if input is Arabizi
        is_arabizi_input = detect_arabizi(message)
        
        # Prepare input for the model
        if is_arabizi_input:
            # Convert Arabizi to Arabic for the model
            arabic_input = arabizi_to_arabic(message)
            print(f"🔄 Converted Arabizi '{message}' → Arabic '{arabic_input}'")
            model_input = arabic_input
        else:
            # Use original input (Arabic or English)
            model_input = message
        
        # Generate response using Arabic input
        messages = [{"role": "user", "content": model_input}]
        
        outputs = model(
            messages, 
            max_new_tokens=256, 
            temperature=0.1,
            do_sample=True,
            pad_token_id=model.tokenizer.eos_token_id
        )
        
        # Extract the response
        response = outputs[0]["generated_text"][-1]["content"].strip()
        
        # Convert response back to Arabizi if input was Arabizi
        if is_arabizi_input:
            arabizi_response = arabic_to_arabizi(response)
            print(f"🔄 Converted response '{response}' → Arabizi '{arabizi_response}'")
            return arabizi_response
        else:
            # Return original response for Arabic/English
            return response
        
    except Exception as e:
        # Return error in appropriate language
        if detect_arabizi(message):
            return f"sorry, kan chi mochkil: {str(e)}. 3awd jar'b!"
        else:
            return f"عذراً، واجهت خطأ: {str(e)}. جرب مرة أخرى! / Sorry, error occurred: {str(e)}. Try again!"

# Create the Gradio interface
demo = gr.ChatInterface(
    fn=chat_with_atlas,
    title="🏔️ Atlas-Chat: Moroccan Arabic AI Assistant",
    description="""
    **مرحبا بك في أطلس شات!** Welcome to Atlas-Chat! 🇲🇦
    
    **🧠 Smart Language Detection & Conversion:**
    - **Arabic Script (العربية)** → AI responds in Arabic
    - **Arabizi (3arabi bi 7oruf latin)** → AI responds in Arabizi  
    - **English** → AI responds in English
    
    **✨ Full Arabizi Support:** Type "shkoun nta?" and get "ana atlas-chat..."
    
    **جرب هذه الأسئلة / Try these questions:**
    """,
    examples=[
        "شكون لي صنعك؟",
        "shkoun li sna3ek?",
        "اشنو هو الطاجين؟",
        "achno howa tajine?", 
        "شنو كيتسمى المنتخب المغربي؟",
        "chno kaytsma lmontakhab lmaghribi?",
        "What is Morocco famous for?",
        "Tell me about Casablanca",
        "كيفاش نقدر نتعلم الدارجة؟",
        "kifash n9der nt3elem darija?",
        "wach kayn atay f lmaghrib?",
        "3lach lmaghrib zwien bzzaf?",
        "kifash nsali tajine?",
        "chno homa l2aklat lmaghribiya?"
    ],
    cache_examples=False
)

# Launch the app
if __name__ == "__main__":
    demo.launch()