from flask import Flask, request, jsonify
from bs4 import BeautifulSoup
import requests
from fake_useragent import UserAgent
import re
import time
import random
import cloudscraper
from urllib.parse import urljoin

app = Flask(__name__)
ua = UserAgent()

def create_scraper():
    """إنشاء cloudscraper مع إعدادات متقدمة"""
    try:
        scraper = cloudscraper.create_scraper(
            browser={
                'browser': 'chrome',
                'platform': 'windows',
                'mobile': False
            }
        )
        
        headers = {
            'User-Agent': ua.random,
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
            'Accept-Language': 'ar,en-US;q=0.7,en;q=0.3',
            'Accept-Encoding': 'gzip, deflate, br',
            'Connection': 'keep-alive',
            'Upgrade-Insecure-Requests': '1',
            'Sec-Fetch-Dest': 'document',
            'Sec-Fetch-Mode': 'navigate',
            'Sec-Fetch-Site': 'none',
            'Sec-Fetch-User': '?1',
            'Cache-Control': 'max-age=0',
            'DNT': '1',
        }
        
        scraper.headers.update(headers)
        return scraper
    except:
        # Fallback إلى requests عادي
        session = requests.Session()
        session.headers.update({
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
        })
        return session

def make_request_advanced(url, max_retries=5):
    """طلب متقدم مع خدع لتجاوز الحماية"""
    for attempt in range(max_retries):
        try:
            scraper = create_scraper()
            
            # تأخير عشوائي بين المحاولات
            time.sleep(random.uniform(2.0, 6.0))
            
            # إضافة معلمات عشوائية للطلب
            params = {'_': str(int(time.time() * 1000))}
            
            response = scraper.get(
                url,
                params=params,
                timeout=30,
                allow_redirects=True
            )
            
            print(f"المحاولة {attempt + 1}: كود الحالة {response.status_code}")
            
            # التحقق من Cloudflare
            if response.status_code in [403, 429, 503]:
                print("تم اكتشاف حماية Cloudflare")
                
                # خدعة: محاولة مع referrer مختلف
                scraper.headers.update({'Referer': 'https://www.google.com/'})
                time.sleep(5)
                continue
                
            if response.status_code == 200:
                # التحقق من أن المحتوى حقيقي وليس صفحة تحقق
                if len(response.text) < 1000 or "cloudflare" in response.text.lower():
                    print("صفحة تحقق Cloudflare")
                    time.sleep(8)
                    continue
                    
                return response
                
        except Exception as e:
            print(f"خطأ في المحاولة {attempt + 1}: {str(e)}")
            time.sleep(4)
    
    return None

def get_best_quality_url(page_url):
    """جلب رابط المشاهدة الأعلى جودة"""
    print(f"جلب الرابط الأعلى جودة: {page_url}")
    response = make_request_advanced(page_url)
    if not response:
        return None

    soup = BeautifulSoup(response.text, "html.parser")
    
    # بحث مرن عن السيرفرات
    servers = []
    selectors = [
        "div.WatchServers ul.WatchServersList li btn",
        "div.WatchServers li btn",
        "li[data-url]",
        "button[data-url]",
        ".server-item",
        "[data-url]"
    ]
    
    for selector in selectors:
        servers = soup.select(selector)
        if servers:
            break
    
    print(f"عدد السيرفرات: {len(servers)}")

    quality_links = []
    for server in servers:
        data_url = server.get("data-url")
        if not data_url:
            continue
            
        quality_text = server.text.strip()
        
        # استخراج الجودة
        quality = 360
        match = re.search(r"\((\d{3,4})p\)", quality_text, re.IGNORECASE)
        if match:
            quality = int(match.group(1))
        
        # جعل الرابط كاملاً إذا كان نسبياً
        if data_url and not data_url.startswith('http'):
            data_url = urljoin('https://myfl.my', data_url)
        
        quality_links.append((quality, data_url))
        print(f"جودة: {quality}p - الرابط: {data_url}")

    if not quality_links:
        return None

    best_quality = max(quality_links, key=lambda x: x[0])
    print(f"أعلى جودة: {best_quality[0]}p")
    return best_quality[1]

def scrape_series_simple(series_url):
    """نسخة مبسطة لجلب البيانات"""
    print(f"جلب بيانات المسلسل: {series_url}")
    response = make_request_advanced(series_url)
    if not response:
        return {"error": "فشل في تحميل صفحة المسلسل بعد عدة محاولات"}

    soup = BeautifulSoup(response.text, "html.parser")
    
    # محاولة العثور على الحلقات بطرق مختلفة
    episodes = []
    selectors = [
        "a[href*='/watch/']",
        ".episode-item",
        ".episode-link",
        "div.episode a"
    ]
    
    for selector in selectors:
        episodes = soup.select(selector)
        if episodes:
            break
    
    # إذا لم نجد، نبحث عن أي روابط تحتوي على watch
    if not episodes:
        all_links = soup.find_all('a', href=True)
        episodes = [link for link in all_links if '/watch/' in link['href']]
    
    print(f"عدد الحلقات الموجودة: {len(episodes)}")

    episodes_data = []
    for ep in episodes[:5]:  # تحد إلى 5 حلقات للاختبار
        ep_name = ep.text.strip() or "حلقة غير معروفة"
        ep_url = ep.get('href')
        
        if ep_url and not ep_url.startswith('http'):
            ep_url = urljoin('https://myfl.my', ep_url)
        
        # استخراج رقم الحلقة
        ep_number = None
        match = re.search(r'(\d+)', ep_name)
        if match:
            ep_number = int(match.group(1))
        
        episodes_data.append({
            "Episoade_Name": ep_name,
            "episoade_order": ep_number,
            "url": ep_url  # يمكنك إضافة get_best_quality_url لاحقاً
        })

    return {
        "episodes": episodes_data,
        "success": True,
        "total_episodes": len(episodes_data),
        "note": "الروابط هي روابط الحلقات، وليست روابط المشاهدة المباشرة"
    }

@app.route("/api/series")
def api_series():
    series_url = request.args.get("series_url")
    if not series_url:
        return jsonify({"error": "يرجى تمرير series_url"}), 400

    data = scrape_series_simple(series_url)
    return jsonify(data)

@app.route("/api/test")
def test_connection():
    """لاختبار الاتصال بالموقع"""
    test_url = "https://myfl.my"
    response = make_request_advanced(test_url)
    
    if response:
        return jsonify({
            "success": True,
            "status_code": response.status_code,
            "content_length": len(response.text),
            "is_cloudflare": "cloudflare" in response.text.lower()
        })
    else:
        return jsonify({
            "success": False,
            "error": "فشل في الاتصال بالموقع"
        })

@app.route('/')
def home():
    return jsonify({
        "message": "Welcome to MyFL Scraper API",
        "endpoints": {
            "series": "/api/series?series_url=URL",
            "test": "/api/test"
        }
    })

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=5000)