"""
سكريبت تشخيص: يختبر رفع صورة لحساب واحد مع طباعة تفصيلية.
الاستخدام: python3 test_photo.py +9647XXXXXXXX
"""
import asyncio
import os
import random
import sys
import logging

logging.basicConfig(level=logging.INFO, format="%(asctime)s | %(levelname)s | %(message)s")
log = logging.getLogger(__name__)

# ─── إعدادات المسارات ──────────────────────────────────────────
SESSIONS_DIR  = "/var/www/kodo/sessions"
PROFILE_DIR   = "/var/www/kodo/profile"

# ─── تحميل config ─────────────────────────────────────────────
sys.path.insert(0, "/var/www/kodo")
import config
from pyrogram import Client
from pyrogram.errors import FloodWait

OP_TIMEOUT = 30

async def main(phone: str):
    print("=" * 60)
    print(f"▶ الحساب المستهدف : {phone}")
    print("=" * 60)

    session_path = os.path.join(SESSIONS_DIR, f"{phone}.session")
    if not os.path.exists(session_path):
        print(f"✗ ملف الجلسة غير موجود: {session_path}")
        return

    print(f"✓ ملف الجلسة موجود : {session_path}")

    # فحص الصور المتاحة
    photos = [f for f in os.listdir(PROFILE_DIR) if f.lower().endswith(".png")]
    if not photos:
        print(f"✗ لا توجد صور .png في: {PROFILE_DIR}")
        return

    chosen = random.choice(photos)
    photo_path = os.path.join(PROFILE_DIR, chosen)
    print(f"✓ الصورة المختارة   : {photo_path}")
    print(f"✓ حجم الصورة        : {os.path.getsize(photo_path):,} bytes")
    print("-" * 60)

    c = None
    try:
        print("⏳ جاري الاتصال بالحساب...")
        c = Client(
            f"{SESSIONS_DIR}/{phone}",
            api_id=config.API_ID,
            api_hash=config.API_HASH,
            no_updates=True,
        )
        await asyncio.wait_for(c.connect(), timeout=OP_TIMEOUT)
        print("✓ تم الاتصال بنجاح")

        print("⏳ جاري تحميل بيانات الحساب (get_me)...")
        me = await asyncio.wait_for(c.get_me(), timeout=OP_TIMEOUT)
        print(f"✓ الاسم الحالي      : {me.first_name} {me.last_name or ''}")
        print(f"✓ المعرف            : @{me.username or 'لا يوجد'}")
        print(f"✓ الصورة الحالية    : {'موجودة' if getattr(me, 'photo', None) else 'لا توجد'}")
        print(f"✓ is_premium        : {getattr(me, 'is_premium', False)}")
        print("-" * 60)

        print(f"⏳ جاري رفع الصورة: {photo_path}")
        for attempt in range(1, 4):
            try:
                print(f"  محاولة {attempt}/3 ...")
                from pyrogram import raw
                import hashlib

                # قراءة الصورة مباشرة وإرسالها عبر Raw MTProto
                with open(photo_path, "rb") as f:
                    data = f.read()

                file_size = len(data)
                file_id = c.rnd_id()
                chunk_size = 512 * 1024  # 512 KB
                chunks = [data[i:i+chunk_size] for i in range(0, file_size, chunk_size)]

                print(f"  حجم الملف: {file_size:,} bytes | عدد الأجزاء: {len(chunks)}")

                for i, chunk in enumerate(chunks):
                    await c.invoke(
                        raw.functions.upload.SaveFilePart(
                            file_id=file_id,
                            file_part=i,
                            bytes=chunk,
                        )
                    )

                input_file = raw.types.InputFile(
                    id=file_id,
                    parts=len(chunks),
                    name=os.path.basename(photo_path),
                    md5_checksum=hashlib.md5(data).hexdigest(),
                )

                result = await c.invoke(
                    raw.functions.photos.UploadProfilePhoto(
                        file=input_file
                    )
                )
                print(f"✓ تم رفع الصورة بنجاح! photo_id={result.photo.id}")
                break
            except FloodWait as e:
                print(f"  FloodWait: انتظار {e.value} ثانية...")
                await asyncio.sleep(e.value * 1.2)
            except Exception as e:
                print(f"  ✗ خطأ في المحاولة {attempt}: {type(e).__name__}: {e}")
                await asyncio.sleep(3)

        print("-" * 60)
        print("⏳ التحقق من الصورة بعد الرفع...")
        me2 = await asyncio.wait_for(c.get_me(), timeout=OP_TIMEOUT)
        print(f"✓ الصورة بعد التعديل: {'موجودة ✅' if getattr(me2, 'photo', None) else 'لا تزال غائبة ✗'}")

    except Exception as e:
        print(f"✗ خطأ عام: {type(e).__name__}: {e}")
    finally:
        if c is not None:
            try:
                await asyncio.wait_for(c.disconnect(), timeout=10)
                print("✓ تم قطع الاتصال")
            except Exception:
                pass
    print("=" * 60)

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("الاستخدام: python3 test_photo.py +9647XXXXXXXX")
        sys.exit(1)
    asyncio.run(main(sys.argv[1]))
