import re

def moderate_text(text: str) -> tuple[bool, str]:
    """
    Checks if the text contains forbidden contact information (phone numbers, IDs, emails, links).
    Returns (is_clean, reason)
    """
    if not text:
        return True, ""
        
    text_lower = text.lower().replace('\u200c', ' ').strip()
    
    # 1. Check for standard/obfuscated links
    link_pattern = r'(https?://|www\.)[^\s]+|t\.me/[^\s]+|telegram\.me/[^\s]+|wa\.me/[^\s]+|instagram\.com/[^\s]+|ig\.me/[^\s]+'
    if re.search(link_pattern, text_lower):
        return False, "ارسال لینک مستقیم در توضیحات مجاز نیست. لطفاً ارتباط خود را داخل پلتفرم حفظ کنید."
        
    # 2. Check for Telegram usernames starting with @
    if re.search(r'@[a-zA-Z0-9_]{3,}', text_lower):
        return False, "ارسال آیدی شبکه‌های اجتماعی (شروع با @) مجاز نیست."
        
    # 3. Check for emails
    email_pattern = r'[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+'
    if re.search(email_pattern, text_lower):
        return False, "ارسال ایمیل مجاز نیست."
        
    obfuscated_email = r'[a-zA-Z0-9_.-]+\s+(?:at|\[at\]|@)\s+[a-zA-Z0-9-]+\s+(?:dot|\[dot\]|\.)\s+[a-zA-Z0-9-.]+'
    if re.search(obfuscated_email, text_lower):
        return False, "ارسال ایمیل مجاز نیست."
        
    # 4. Check for Card numbers (16 digits) and Shaba numbers (IR + 24 digits)
    normalized_text = re.sub(r'[\s-]', '', text_lower)
    if re.search(r'\b\d{16}\b', normalized_text):
        return False, "ارسال شماره کارت بانکی در متون عمومی مجاز نیست."
        
    shaba_pattern = r'ir\s*\d{2}(?:\s*\d{4}){5}\s*\d{2}|\bir\d{24}\b'
    if re.search(shaba_pattern, text_lower):
        return False, "ارسال شماره شبا در متون عمومی مجاز نیست."

    # 5. Check for phone numbers
    # Convert Persian/Arabic digits to English
    persian_to_english = {
        '۰': '0', '۱': '1', '۲': '2', '۳': '3', '۴': '4',
        '۵': '5', '۶': '6', '۷': '7', '۸': '8', '۹': '9',
        '٠': '0', '١': '1', '٢': '2', '٣': '3', '٤': '4',
        '٥': '5', '٦': '6', '٧': '7', '٨': '8', '٩': '9'
    }
    normalized_digits = text_lower
    for p_digit, e_digit in persian_to_english.items():
        normalized_digits = normalized_digits.replace(p_digit, e_digit)
        
    digits_only = re.sub(r'\D', '', normalized_digits)
    # Iranian phone sequence: starts with 09, +989, 989, or just 9 followed by 9 digits
    if re.search(r'(09|989|9)\d{9}', digits_only):
        return False, "ارسال شماره تماس مجاز نیست. لطفاً ارتباط خود را داخل پلتفرم حفظ کنید."
        
    # continuous sequence of 8 or more digits
    if re.search(r'\d{8,}', digits_only):
        return False, "ارسال شماره تماس یا شناسه عددی طولانی مجاز نیست."

    # 6. Check for phone numbers written in Persian words
    persian_number_words = {
        'صفر', 'یک', 'دو', 'سه', 'چهار', 'پنج', 'شش', 'هفت', 'هشت', 'نه', 'ده',
        'نهصد', 'هشتصد', 'هفتصد', 'ششصد', 'پانصد', 'چهارصد', 'سیصد', 'دویست', 'صد',
        'نود', 'هشتاد', 'هفتاد', 'شصت', 'پنجاه', 'چهل', 'سی', 'بیست',
        'یازده', 'دوازده', 'سیزده', 'چهارده', 'پانزده', 'شانزده', 'هفده', 'هجده', 'نوزده'
    }
    words = re.findall(r'\w+', text_lower)
    consecutive_number_words = 0
    for w in words:
        if w in persian_number_words or w.isdigit():
            consecutive_number_words += 1
            if consecutive_number_words >= 3:
                return False, "به نظر می‌رسد قصد ارسال شماره تماس به صورت حروفی را دارید. این کار خلاف قوانین است."
        else:
            if w == 'و':
                continue
            consecutive_number_words = 0
            
    # 7. Keywords indicating contact info bypass
    forbidden_combinations = [
        ('واتساپ',), ('واتس', 'اپ'), ('whatsapp',),
        ('تلگرام',), ('telegram',),
        ('اینستاگرام',), ('instagram',),
        ('روبیکا',), ('ایتا',), ('بله', 'پیام'),
        ('پیوی',), ('pv',), ('تماس', 'مستقیم'), ('شماره', 'همراه'),
        ('زنگ', 'بزنید')
    ]
    for comb in forbidden_combinations:
        if all(part in text_lower for part in comb):
            return False, "درخواست ارتباط مستقیم در خارج از پلتفرم مجاز نیست. لطفاً مکاتبات و پرداخت‌های خود را از طریق سایت و ربات دنبال کنید."
            
    return True, ""
