/**
 * src/arabic/dialect-detector.ts
 * كاشف اللهجات السعودية — Saudi dialect detector + Arabizi support
 */
import { createChildLogger } from '../utils/logger.js';
const log = createChildLogger('arabic:dialect');
const DIALECT_PATTERNS = {
    hijazi: {
        words: [
            'كذا', 'ايش', 'ود', 'دحين', 'لسه', 'كدا', 'ابد',
            'يالله', 'قوي', 'شغل', 'زي', 'فاضي', 'مره', 'برضو',
            'طيب', 'يعني', 'حته', 'ذاك', 'هيك', 'ليش', 'وين',
            'تمام', 'حاجة', 'شوي', 'لكان', 'يارب',
        ],
        phrases: [
            'ايش ذا', 'كذا كذا', 'الله يعطيك العافية', 'ياخي',
            'والله ان', 'مره حلو', 'يا حبيبي', 'وش لون',
            'ايش فيك', 'لا تقول كذا', 'انا ودي',
        ],
        weight: 1.0,
    },
    najdi: {
        words: [
            'وش', 'زين', 'هالحين', 'ذلحين', 'يبه', 'توه', 'هاه',
            'ياخي', 'خلاص', 'يالغالي', 'يمديك', 'شسمه', 'لا والله',
            'عساك', 'بعدين', 'ترى', 'طال عمرك', 'منو', 'يابعد',
            'شفيك', 'وشلون', 'اجل', 'يالطيب', 'كفو',
        ],
        phrases: [
            'وش تبي', 'وش لون', 'هالحين الحين', 'يمديك تسوي',
            'لا والله ما', 'عسى ما شر', 'ترى انا', 'يابعد حيي',
            'شسمه يعني', 'توه الحين',
        ],
        weight: 1.0,
    },
    eastern: {
        words: [
            'ها', 'شلونك', 'شكو', 'ماكو', 'هاي', 'جا', 'يمعود',
            'شلون', 'أونه', 'اشتبيه', 'حدك', 'بوي', 'هالشكل',
            'هيج', 'يابه', 'خوش', 'اكو', 'يوبه',
        ],
        phrases: [
            'شلونك يمعود', 'شكو ماكو', 'ها شخبارك',
            'خوش شي', 'يابه ترى', 'هالشكل زين',
        ],
        weight: 1.0,
    },
    southern: {
        words: [
            'يخي', 'قال', 'سير', 'هني', 'غادي', 'يارجال', 'صاحي',
            'ذيك', 'هلا', 'حنا', 'كيف ذا', 'عاد', 'قوم', 'يامحمد',
            'ذي', 'ابشر', 'حي', 'روح', 'تعال',
        ],
        phrases: [
            'سير من هني', 'يارجال ترى', 'كيف ذا الحال',
            'حنا كذا', 'الله يحييك',
        ],
        weight: 1.0,
    },
    msa: {
        words: [
            'أريد', 'أستطيع', 'بإمكاني', 'يرجى', 'يُرجى', 'حضرتك',
            'سيادتكم', 'أودّ', 'أتمنى', 'لذلك', 'بالتالي', 'إذن',
            'علاوة', 'فضلاً', 'نظراً', 'حيث', 'هل يمكنني', 'أرجو',
            'أفيدكم', 'نفيدكم', 'يسعدني', 'تحية',
        ],
        phrases: [
            'السلام عليكم ورحمة الله', 'هل بإمكاني', 'أودّ الاستفسار',
            'يرجى التكرم', 'مع فائق الاحترام', 'نفيدكم علماً',
            'أتقدم بطلب',
        ],
        weight: 0.8, // MSA is baseline, slightly lower weight
    },
};
// ─── Detector ───────────────────────────────────────────────────────
export function detectDialect(text) {
    const normalized = text.trim();
    if (!normalized) {
        return { dialect: 'unknown', confidence: 0, signals: [] };
    }
    const scores = {};
    for (const [dialect, patterns] of Object.entries(DIALECT_PATTERNS)) {
        let score = 0;
        const signals = [];
        // Check words
        for (const word of patterns.words) {
            if (normalized.includes(word)) {
                score += 1 * patterns.weight;
                signals.push(word);
            }
        }
        // Check phrases (higher weight)
        for (const phrase of patterns.phrases) {
            if (normalized.includes(phrase)) {
                score += 2 * patterns.weight;
                signals.push(`[${phrase}]`);
            }
        }
        scores[dialect] = { score, signals };
    }
    // Find winner
    let bestDialect = 'unknown';
    let bestScore = 0;
    let bestSignals = [];
    let totalScore = 0;
    for (const [dialect, { score, signals }] of Object.entries(scores)) {
        totalScore += score;
        if (score > bestScore) {
            bestScore = score;
            bestDialect = dialect;
            bestSignals = signals;
        }
    }
    if (bestScore === 0) {
        // Check if text is Arabic at all
        const arabicChars = normalized.match(/[\u0600-\u06FF]/g)?.length ?? 0;
        const isArabic = arabicChars / normalized.replace(/\s/g, '').length > 0.3;
        if (isArabic) {
            return { dialect: 'msa', confidence: 0.3, signals: ['Arabic text, no dialect markers'] };
        }
        return { dialect: 'unknown', confidence: 0, signals: [] };
    }
    const confidence = Math.min(1, bestScore / Math.max(totalScore, 1) * (bestScore > 3 ? 1 : 0.6));
    log.debug({ dialect: bestDialect, confidence, signalCount: bestSignals.length }, 'Dialect detected');
    return { dialect: bestDialect, confidence, signals: bestSignals };
}
// ─── Arabizi Detection & Conversion ─────────────────────────────────
const ARABIZI_INDICATORS = [
    /[0-9]*[2378][a-z]/i, // Numbers used as letters: 7abibi, 3adi, 2ool
    /\b(ya|yalla|wallah|insha|masha|7abibi|3adi|5alas|sa7)\b/i,
    /\b(ahlan|shukran|ma3|min|inta|ana|howa|hiya)\b/i,
    /\b(shu|wen|kif|lesh|bas|w|la|fi|3ala|mn)\b/i,
];
const ARABIZI_NUMBER_MAP = {
    '2': 'ء', // hamza
    '3': 'ع',
    "3'": 'غ',
    '5': 'خ',
    '6': 'ط',
    "6'": 'ظ',
    '7': 'ح',
    '8': 'ق',
    '9': 'ص',
    "9'": 'ض',
};
const ARABIZI_LETTER_MAP = {
    'a': 'ا', 'b': 'ب', 't': 'ت', 'th': 'ث', 'j': 'ج',
    'h': 'ه', 'kh': 'خ', 'd': 'د', 'dh': 'ذ', 'r': 'ر',
    'z': 'ز', 's': 'س', 'sh': 'ش', 'f': 'ف', 'q': 'ق',
    'k': 'ك', 'l': 'ل', 'm': 'م', 'n': 'ن', 'w': 'و',
    'y': 'ي', 'i': 'ي', 'e': 'ي', 'o': 'و', 'u': 'و',
    'g': 'ق', 'p': 'ب', 'v': 'ف', 'ch': 'تش',
    'aa': 'ا', 'ee': 'ي', 'oo': 'و', 'ou': 'و',
};
export function isArabizi(text) {
    if (!text || text.trim().length < 2)
        return false;
    // If it has Arabic characters, it's not Arabizi
    if (/[\u0600-\u06FF]/.test(text))
        return false;
    let matchCount = 0;
    for (const pattern of ARABIZI_INDICATORS) {
        if (pattern.test(text))
            matchCount++;
    }
    return matchCount >= 2;
}
export function arabiziToArabic(text) {
    if (!text)
        return '';
    let result = text.toLowerCase();
    // Replace numbered letters first (with primes)
    for (const [num, arabic] of Object.entries(ARABIZI_NUMBER_MAP).sort((a, b) => b[0].length - a[0].length)) {
        result = result.replaceAll(num, arabic);
    }
    // Replace multi-char Latin combos first, then single chars
    const sortedLetters = Object.entries(ARABIZI_LETTER_MAP).sort((a, b) => b[0].length - a[0].length);
    for (const [latin, arabic] of sortedLetters) {
        result = result.replaceAll(latin, arabic);
    }
    // Clean up spaces
    result = result.replace(/\s+/g, ' ').trim();
    return result;
}
//# sourceMappingURL=dialect-detector.js.map