from flask import Flask, request, jsonify
import requests
from bs4 import BeautifulSoup
from fake_useragent import UserAgent
import re
from urllib.parse import quote, urljoin
from urllib.parse import unquote

app = Flask(__name__)

# توليد User-Agent عشوائي
ua = UserAgent()
user_agent = ua.random

# إنشاء جلسة Requests
session = requests.Session()
session.headers.update({'User-Agent': user_agent})

def extract_series_info(series_url):
    """استخراج معلومات المسلسل من الرابط"""
    decoded_url = unquote(series_url)
    match = re.search(r'مسلسل-(.*?)(/|$)', decoded_url)
    if match:
        return match.group(1).replace('-', ' ')
    return None

def generate_episode_urls(series_url, max_episodes=300):
    """توليد روابط الحلقات بناءً على النمط الرسمي للموقع"""
    try:
        # استخراج اسم المسلسل من الرابط
        decoded_url = unquote(series_url)
        match = re.search(r'مسلسل-(.*?)(/|$)', decoded_url)
        if not match:
            return []
        
        series_name = match.group(1)
        
        # جلب الحلقة الأخيرة لمعرفة عدد الحلقات
        last_episode = find_last_episode(series_url) or max_episodes
        
        # توليد روابط جميع الحلقات بالتنسيق الرسمي
        base_url = "https://wecima.video/watch/"
        episodes = []
        
        for ep_num in range(1, last_episode + 1):
            # النمط الرسمي: مشاهدة-مسلسل-الخائن-حلقة-1
            ep_url = f"{base_url}مشاهدة-مسلسل-{series_name}-حلقة-{ep_num}/"
            ep_url = quote(ep_url, safe='/:')  # تشفير الجزء العربي فقط
            
            episodes.append({
                "Episoade_Name": f"الحلقة {ep_num}",
                "episoade_order": ep_num,
                "url": ep_url
            })
        
        return episodes
    
    except Exception as e:
        print(f"Error generating episodes: {str(e)}")
        return []


def find_last_episode(series_url):
    """العثور على رقم آخر حلقة من الصفحة الرئيسية"""
    try:
        response = session.get(series_url, timeout=10)
        if response.status_code != 200:
            return None
            
        soup = BeautifulSoup(response.text, 'html.parser')
        episodes = []
        
        for link in soup.find_all("a", href=True):
            title = link.select_one("episodetitle")
            if title:
                match = re.search(r'(\d+)', title.get_text())
                if match:
                    episodes.append(int(match.group(1)))
        
        return max(episodes) if episodes else None
        
    except:
        return None

@app.route('/api/series', methods=['GET'])
def fetch_series_data():
    try:
        series_url = request.args.get('series_url')
        if not series_url:
            return jsonify({"success": False, "message": "يرجى تقديم رابط المسلسل"}), 400

        # الطريقة الجديدة: توليد الروابط
        generated_episodes = generate_episode_urls(series_url)
        
        # الطريقة القديمة كنسخة احتياطية
        if not generated_episodes:
            response = session.get(series_url)
            if response.status_code != 200:
                return jsonify({"success": False, "message": "فشل في جلب صفحة المسلسل"}), 400

            soup = BeautifulSoup(response.text, 'html.parser')
            episodes_data = []
            
            for link in soup.find_all("a", href=True):
                title = link.select_one("episodetitle")
                if title:
                    match = re.search(r'(\d+)', title.get_text())
                    if match:
                        ep_num = int(match.group(1))
                        episodes_data.append({
                            "Episoade_Name": f"الحلقة {ep_num}",
                            "episoade_order": ep_num,
                            "url": link['href'].strip()
                        })
            
            episodes_data.sort(key=lambda x: x["episoade_order"])
            return jsonify({"success": True, "episodes": episodes_data}), 200
        
        return jsonify({
            "success": True,
            "episodes": generated_episodes,
            "message": "تم توليد الروابط بنجاح"
        }), 200
        
    except Exception as e:
        return jsonify({"success": False, "message": str(e)}), 500

@app.route('/api/search_series', methods=['GET'])
def search_series():
    try:
        name = request.args.get('name')
        if not name:
            return jsonify({"success": False, "message": "يرجى تقديم اسم المسلسل"}), 400

        search_url = f"https://wecima.video/?s={quote(name)}"
        response = session.get(search_url)
        if response.status_code != 200:
            return jsonify({"success": False, "message": "فشل في البحث"}), 400

        soup = BeautifulSoup(response.text, 'html.parser')
        first_result = None
        
        for a_tag in soup.find_all("a", href=True):
            href = a_tag["href"]
            if "/مسلسل-" in href or "/series/" in href:
                first_result = a_tag
                break

        if not first_result:
            return jsonify({"success": False, "message": "لم يتم العثور على المسلسل"}), 404

        series_url = first_result['href']
        generated_episodes = generate_episode_urls(series_url)
        
        if not generated_episodes:
            # استخدام الطريقة القديمة إذا فشل التوليد
            response = session.get(series_url)
            if response.status_code != 200:
                return jsonify({"success": False, "message": "فشل في جلب المسلسل"}), 400

            soup = BeautifulSoup(response.text, 'html.parser')
            episodes_data = []
            
            for link in soup.find_all("a", href=True):
                title = link.select_one("episodetitle")
                if title:
                    match = re.search(r'(\d+)', title.get_text())
                    if match:
                        ep_num = int(match.group(1))
                        episodes_data.append({
                            "Episoade_Name": f"الحلقة {ep_num}",
                            "episoade_order": ep_num,
                            "url": link['href'].strip()
                        })
            
            episodes_data.sort(key=lambda x: x["episoade_order"])
            return jsonify({"success": True, "episodes": episodes_data}), 200
        
        return jsonify({
            "success": True,
            "episodes": generated_episodes,
            "series_url": series_url
        }), 200

    except Exception as e:
        return jsonify({"success": False, "message": str(e)}), 500

if __name__ == '__main__':
    app.run(debug=True)