"""
برنامه لاگین به روبیکا با ذخیره نشست (Session)
سازگار با نسخه 7.3.5 rubpy
"""

import asyncio
import os
import json
from datetime import datetime

try:
    from rubpy import Client
except ImportError as e:
    print(f"❌ خطا در import: {e}")
    print("لطفاً دستور زیر را اجرا کنید:")
    print("pip install rubpy==7.3.5")
    exit(1)

# تنظیمات
SESSION_FILE = "rubika_session.json"

def clear_screen():
    os.system('cls' if os.name == 'nt' else 'clear')

def print_info(message, msg_type="info"):
    colors = {
        "info": "\033[94m",
        "success": "\033[92m", 
        "error": "\033[91m",
        "warning": "\033[93m",
        "reset": "\033[0m"
    }
    print(f"{colors.get(msg_type, '')}{message}{colors['reset']}")

def save_auth_data(auth_data):
    with open(SESSION_FILE, 'w', encoding='utf-8') as f:
        json.dump(auth_data, f, indent=2, ensure_ascii=False)
    print_info(f"✅ نشست در فایل {SESSION_FILE} ذخیره شد")

def load_auth_data():
    if os.path.exists(SESSION_FILE):
        try:
            with open(SESSION_FILE, 'r', encoding='utf-8') as f:
                return json.load(f)
        except:
            return None
    return None

def delete_session():
    if os.path.exists(SESSION_FILE):
        os.remove(SESSION_FILE)
        print_info("🗑️ فایل نشست حذف شد")
    else:
        print_info("ℹ️ فایل نشست وجود ندارد")

async def login_first_time():
    """لاگین اولیه و ذخیره نشست"""
    print_info("\n🔐 لاگین اولیه به روبیکا", "info")
    print("=" * 40)
    
    phone = input("📱 شماره موبایل (مثال: 989123456789): ").strip()
    
    if not phone:
        print_info("❌ شماره موبایل الزامی است", "error")
        return
    
    try:
        # ایجاد کلاینت با name
        async with Client(name="rubika_client") as client:
            print_info("📤 در حال ارسال کد تأیید...", "info")
            
            # ارسال کد
            send_code = await client.send_code(phone)
            
            if hasattr(send_code, 'status') and send_code.status != "SUCCESS":
                print_info(f"❌ خطا در ارسال کد: {send_code}", "error")
                return
            
            code = input("🔢 کد تأیید را وارد کنید: ").strip()
            
            if not code:
                print_info("❌ کد تأیید الزامی است", "error")
                return
            
            # ورود با کد
            sign_in = await client.sign_in(phone, code)
            
            if hasattr(sign_in, 'status') and sign_in.status != "SUCCESS":
                print_info(f"❌ خطا در ورود: {sign_in}", "error")
                return
            
            # دریافت اطلاعات کاربر
            me = await client.get_me()
            
            # ذخیره اطلاعات نشست
            auth_data = {
                "phone": phone,
                "user_guid": getattr(me, 'user_guid', None),
                "first_name": getattr(me, 'first_name', ''),
                "last_name": getattr(me, 'last_name', ''),
                "login_time": datetime.now().isoformat()
            }
            
            save_auth_data(auth_data)
            print_info(f"✅ خوش آمدید {me.first_name}", "success")
            
    except Exception as e:
        print_info(f"❌ خطا: {e}", "error")

async def login_with_session():
    """ورود با نشست ذخیره شده"""
    auth_data = load_auth_data()
    
    if not auth_data:
        print_info("❌ فایل نشست یافت نشد. ابتدا لاگین اولیه را انجام دهید.", "error")
        return False
    
    try:
        print_info("🔐 در حال اتصال با نشست ذخیره شده...", "info")
        
        # ایجاد کلاینت با name
        async with Client(name="rubika_client") as client:
            # تنظیم user_guid
            if auth_data.get('user_guid'):
                client.user_guid = auth_data['user_guid']
            
            # دریافت اطلاعات کاربر برای تأیید
            me = await client.get_me()
            
            print_info(f"✅ خوش آمدید {me.first_name}", "success")
            print(f"   📞 شماره: {auth_data.get('phone')}")
            print(f"   🆔 GUID: {getattr(me, 'user_guid', 'نامشخص')}")
            
            return True
            
    except Exception as e:
        print_info(f"❌ خطا در اتصال: {e}", "error")
        print_info("💡 لطفاً مجدداً لاگین اولیه را انجام دهید.", "warning")
        return False

async def show_info():
    """نمایش اطلاعات حساب"""
    auth_data = load_auth_data()
    
    if not auth_data:
        print_info("❌ فایل نشست یافت نشد", "error")
        return
    
    print_info("\n📋 اطلاعات حساب:", "info")
    print("=" * 40)
    print(f"   👤 نام: {auth_data.get('first_name', 'نامشخص')} {auth_data.get('last_name', '')}")
    print(f"   📞 شماره: {auth_data.get('phone', 'نامشخص')}")
    print(f"   🕐 زمان لاگین: {auth_data.get('login_time', 'نامشخص')}")
    print(f"   🆔 GUID: {auth_data.get('user_guid', 'نامشخص')}")

async def send_message():
    """ارسال پیام"""
    auth_data = load_auth_data()
    
    if not auth_data:
        print_info("❌ فایل نشست یافت نشد", "error")
        return
    
    guid = input("🆔 GUID مخاطب: ").strip()
    text = input("✏️ متن پیام: ").strip()
    
    if not guid or not text:
        print_info("❌ GUID و متن پیام الزامی هستند", "error")
        return
    
    try:
        async with Client(name="rubika_client") as client:
            if auth_data.get('user_guid'):
                client.user_guid = auth_data['user_guid']
            
            result = await client.send_message(guid, text)
            
            if hasattr(result, 'message_id'):
                print_info(f"✅ پیام با موفقیت ارسال شد (ID: {result.message_id})", "success")
            else:
                print_info("✅ پیام ارسال شد", "success")
            
    except Exception as e:
        print_info(f"❌ خطا در ارسال پیام: {e}", "error")

async def get_guid_by_phone():
    """دریافت GUID بر اساس شماره موبایل"""
    auth_data = load_auth_data()
    
    if not auth_data:
        print_info("❌ فایل نشست یافت نشد", "error")
        return
    
    phone = input("📱 شماره موبایل (با کد کشور): ").strip()
    
    if not phone:
        print_info("❌ شماره موبایل الزامی است", "error")
        return
    
    try:
        async with Client(name="rubika_client") as client:
            if auth_data.get('user_guid'):
                client.user_guid = auth_data['user_guid']
            
            # جستجوی کاربر
            result = await client.search_contact(phone)
            
            if result and hasattr(result, 'user_guid'):
                print_info(f"🆔 GUID: {result.user_guid}", "success")
            else:
                print_info("❌ کاربر یافت نشد", "error")
            
    except Exception as e:
        print_info(f"❌ خطا: {e}", "error")

async def main():
    while True:
        clear_screen()
        print("=" * 55)
        print("🤖 روبیکا لاگین - مدیریت حساب")
        print("=" * 55)
        print("\n📋 منوی اصلی:")
        print("   1. 🆕 لاگین اولیه (ایجاد نشست جدید)")
        print("   2. 🔐 ورود با نشست ذخیره شده")
        print("   3. 👤 نمایش اطلاعات حساب")
        print("   4. 📤 ارسال پیام")
        print("   5. 🔍 دریافت GUID از شماره موبایل")
        print("   6. 🗑️ حذف فایل نشست")
        print("   7. 🚪 خروج")
        print("-" * 55)
        
        choice = input("\n👉 انتخاب شما (1-7): ").strip()
        
        if choice == "1":
            print("\n")
            await login_first_time()
            input("\n⏎ برای ادامه کلیک کنید...")
            
        elif choice == "2":
            print("\n")
            await login_with_session()
            input("\n⏎ برای ادامه کلیک کنید...")
            
        elif choice == "3":
            print("\n")
            await show_info()
            input("\n⏎ برای ادامه کلیک کنید...")
            
        elif choice == "4":
            print("\n")
            await send_message()
            input("\n⏎ برای ادامه کلیک کنید...")
            
        elif choice == "5":
            print("\n")
            await get_guid_by_phone()
            input("\n⏎ برای ادامه کلیک کنید...")
            
        elif choice == "6":
            print("\n")
            delete_session()
            input("\n⏎ برای ادامه کلیک کنید...")
            
        elif choice == "7":
            print_info("\n👋 خدانگهدار!", "success")
            break
            
        else:
            print_info("❌ انتخاب نامعتبر. لطفاً عدد 1 تا 7 را وارد کنید.", "error")
            input("\n⏎ برای ادامه کلیک کنید...")


if __name__ == "__main__":
    try:
        asyncio.run(main())
    except KeyboardInterrupt:
        print_info("\n\n👋 برنامه با Ctrl+C متوقف شد.", "warning")
    except Exception as e:
        print_info(f"\n❌ خطای غیرمنتظره: {e}", "error")
        input("\n⏎ برای خروج کلیک کنید...")