import os
import logging
import re
from collections import defaultdict

# إعداد تسجيل الأخطاء
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

def extract_domain(url: str) -> str:
    """
    تستخرج اسم الدومين من URL.

    Args:
    url (str): الرابط.

    Returns:
    str: اسم الدومين.
    """
    match = re.search(r'//(www\.)?([a-zA-Z0-9.-]+)', url)
    if match:
        domain = match.group(2)  # الحصول على الدومين الكامل
        return domain  # إرجاع الدومين الكامل
    return None

def is_valid_line(line: str) -> bool:
    """
    يتحقق مما إذا كانت السطر صالح أم لا (لا يحتوي على أحجام ملفات أو صيغة غير صحيحة).

    Args:
    line (str): السطر النصي.

    Returns:
    bool: True إذا كان السطر صالح، False خلاف ذلك.
    """
    line = line.lower().strip()
    # تحقق من أن السطر يحتوي على صيغة URL|username|password
    if re.search(r'\d+\s*kb', line):  # تجاهل أي سطر يحتوي على حجم مثل 1kb
        return False
    
    return True

def extract_credentials(line: str) -> (str, str):
    """
    تستخرج بيانات الاعتماد من سطر نصي.

    Args:
    line (str): السطر النصي المحتوي على URL وusername:password.

    Returns:
    (str, str): اسم الدومين وبيانات الاعتماد.
    """
    match = re.search(r'(https?://[^\s|]+)\|([^|]+)\|([^|]+)', line)
    if match:
        url = match.group(1)  # الرابط
        username = match.group(2)  # اسم المستخدم
        password = match.group(3)  # كلمة المرور
        domain = extract_domain(url)  # استخراج الدومين من الرابط
        return domain, f"{username}:{password}"
    return None, None

def save_credentials(credentials: defaultdict):
    """
    يحفظ بيانات الاعتماد في ملفات نصية منفصلة لكل موقع.

    Args:
    credentials (defaultdict): القاموس المحتوي على الموقع ككيب وبيانات الاعتماد كقيم.
    """
    output_folder = 'extracted_credentials'
    os.makedirs(output_folder, exist_ok=True)

    if not credentials:
        logging.warning("لا توجد بيانات اعتماد لحفظها.")
        return
    
    for domain, creds in credentials.items():
        # اسم الملف سيكون الدومين مع إضافة .txt
        file_name = f"{domain}.txt"  # الدومين كمسمى للملف
        file_path = os.path.join(output_folder, file_name)
        with open(file_path, 'w', encoding='utf-8') as file:
            # إزالة التكرار قبل الحفظ
            unique_creds = set(creds)  # إزالة التكرار
            for cred in unique_creds:
                file.write(f"{cred}\n")
        logging.info(f"تم حفظ بيانات الاعتماد للدومين: {domain} في الملف: {file_name}")

def process_combo_file(combo_file: str):
    """
    يعالج ملف الكومبو ويستخرج بيانات الاعتماد.

    Args:
    combo_file (str): مسار ملف الكومبو.
    """
    credentials = defaultdict(list)

    try:
        with open(combo_file, 'r', encoding='utf-8') as file:
            for line in file:
                line = line.strip()
                if not is_valid_line(line):
                    logging.warning(f"تم تجاهل السطر غير الصالح: {line}")
                    continue

                print(f"معالجة السطر: {line}")  # لطباعة السطر الحالي
                domain, user_pass = extract_credentials(line)
                if domain and user_pass:
                    credentials[domain].append(user_pass)
                else:
                    logging.warning(f"لا توجد بيانات اعتماد صالحة في السطر: {line}")

        if not credentials:
            print("لم يتم استخراج أي بيانات اعتماد.")  # في حالة عدم العثور على بيانات

    except FileNotFoundError:
        logging.error(f"لم يتم العثور على الملف: {combo_file}")
    except Exception as e:
        logging.error(f"حدث خطأ: {e}")
    
    save_credentials(credentials)

def main():
    combo_file = 'combo.txt'  # اسم ملف الكومبو الخاص بك
    process_combo_file(combo_file)
    logging.info("تم استخراج البيانات وحفظها بنجاح.")


if __name__ == "__main__":
    main()      ضيف في خصة اختار شي واحد بس 2