from instagrapi import Client
from instagrapi.exceptions import ChallengeRequired, ClientError
import time
import random
import os
import json
from pathlib import Path

class InstagramGrowthBot:
    def __init__(self):
        self.cl = Client()
        self.SESSION_FILE = "ig_session.json"
        self.cl.delay_range = [1, 3]
        self.actions_today = 0
        self.MAX_ACTIONS = 100
        self.DELAY_RANGE = (15, 35)
        self.username = ""
        self.load_session()

    def load_session(self):
        if Path(self.SESSION_FILE).exists():
            try:
                self.cl.load_settings(self.SESSION_FILE)
                self.username = self.cl.account_info().username
                print("✅ تم تحميل الجلسة بنجاح")
                return True
            except Exception as e:
                print(f"❌ فشل تحميل الجلسة: {e}")
                os.remove(self.SESSION_FILE)
        return False

    def save_session(self):
        self.cl.dump_settings(self.SESSION_FILE)
        print("🔒 تم حفظ الجلسة!")

    def safe_login(self):
        if self.load_session():
            return
            
        print("\n" + "="*30)
        self.username = input("أدخل اسم المستخدم: ").strip()
        password = input("أدخل كلمة المرور: ").strip()

        try:
            self.cl.login(self.username, password)
            print(f"\n✅ تم تسجيل الدخول كـ @{self.username}")
            self.save_session()
        except ChallengeRequired:
            self.handle_challenge()
        except Exception as e:
            print(f"❌ خطأ في التسجيل: {e}")
            exit()

    def handle_challenge(self):
        print("\n⚠️ يلزم تأكيد الهوية (تم إرسال رمز إلى بريدك/هاتفك)")
        code = input("أدخل الرمز المكون من 6 أرقام: ").strip()
        try:
            self.cl.challenge_resolve(self.cl.last_json, code)
            print("✅ تم التأكيد بنجاح!")
            self.save_session()
        except Exception as e:
            print(f"❌ فشل التأكيد: {e}")
            exit()

    def run_operation(self):
        print("\n" + "="*30)
        print("1. متابعة الحسابات\n2. إلغاء المتابعة\n3. العودة")
        choice = input("اختر الإجراء: ").strip()
        
        if choice == "1":
            self.smart_follow()
        elif choice == "2":
            self.smart_unfollow()
        else:
            return

    def smart_follow(self):
        try:
            targets = self.load_targets()
            print(f"⏳ بدء المتابعة لـ {len(targets)} حساب...")
            
            for idx, username in enumerate(targets, 1):
                if self.actions_today >= self.MAX_ACTIONS:
                    print("⚠️ وصلت للحد اليومي")
                    break
                
                try:
                    user_id = self.cl.user_id_from_username(username)
                    user_info = self.cl.user_info(user_id)
                    
                    if not user_info.friendship_status.following:
                        self.cl.user_follow(user_id)
                        print(f"✅ [{idx}] متابعة @{username}")
                        self.actions_today += 1
                        self.human_delay()
                        
                except json.JSONDecodeError:
                    print(f"❌ خطأ في بيانات @{username} - تم التخطي")
                    self.human_delay()
                except Exception as e:
                    print(f"❌ خطأ في @{username}: {str(e)[:50]}")
                    self.human_delay()
                    
        except Exception as e:
            print(f"❌ فشل العملية: {e}")

    def smart_unfollow(self):
        try:
            following = self.cl.user_following(self.cl.user_id)
            print(f"⏳ بدء إلغاء المتابعة لـ {len(following)} حساب...")
            
            for idx, user_id in enumerate(following.keys(), 1):
                if self.actions_today >= self.MAX_ACTIONS:
                    print("⚠️ وصلت للحد اليومي")
                    break
                
                try:
                    user_info = self.cl.user_info(user_id)
                    self.cl.user_unfollow(user_id)
                    print(f"✅ [{idx}] إلغاء متابعة @{user_info.username}")
                    self.actions_today += 1
                    self.human_delay()
                    
                except Exception as e:
                    print(f"❌ خطأ في @{user_info.username}: {str(e)[:50]}")
                    self.human_delay()
                    
        except Exception as e:
            print(f"❌ فشل العملية: {e}")

    def load_targets(self):
        try:
            with open("targets.txt", "r") as f:
                return [line.strip() for line in f if line.strip()]
        except FileNotFoundError:
            print("❌ ملف targets.txt غير موجود")
            return []

    def human_delay(self):
        delay = random.randint(*self.DELAY_RANGE)
        print(f"⏳ انتظر {delay} ثانية...")
        time.sleep(delay)

    def show_menu(self):
        while True:
            print("\n" + "="*30)
            print("🛠️ قائمة إدارة الحسابات")
            print("1. بدء العملية\n2. الإحصائيات\n3. إضافة حسابات\n4. تصدير النشاطات\n5. الخروج")
            choice = input("اختر خيارًا (1-5): ").strip()
            
            if choice == "1":
                self.run_operation()
            elif choice == "5":
                self.cl.logout()
                print("✅ تم الخروج بنجاح!")
                exit()
            else:
                print("⚠️ الخيار غير متوفر حاليا")

if __name__ == "__main__":
    bot = InstagramGrowthBot()
    bot.safe_login()
    bot.show_menu()  صححه حسب الوثائق  instagrapi كاملا لديك صلحبات التعديل والاتقان