from flask import Flask, request, jsonify
from bs4 import BeautifulSoup
import requests
from fake_useragent import UserAgent
import re
import time
from concurrent.futures import ThreadPoolExecutor, as_completed

app = Flask(__name__)

# إنشاء جلسة Requests مع User-Agent مزيف
ua = UserAgent()
user_agent = ua.random
session = requests.Session()
session.headers.update({'User-Agent': user_agent})


def resolve_final_download_url(redirect_url):
    """زيارة رابط ad.php واستخراج رابط التحميل النهائي"""
    r = session.get(redirect_url)
    if r.status_code != 200:
        return None

    soup = BeautifulSoup(r.text, "html.parser")

    # الموقع بيطلب انتظار 5 ثواني
    time.sleep(6)

    download_btn = soup.select_one("a#downloadBtn")
    if not download_btn:
        return None

    return download_btn.get("href")


def get_best_download_url(page_url):
    """جلب رابط التحميل الأعلى جودة من صفحة (حلقة أو فيلم)"""
    r = session.get(page_url)
    if r.status_code != 200:
        return None

    soup = BeautifulSoup(r.text, "html.parser")
    servers = soup.select("div.Download--Myfilmey--Single ul.List--Download--Myfilmey--Single li a")

    quality_links = []
    for server in servers:
        link = server.get("href")
        quality_text = server.get_text(strip=True)

        match = re.search(r"(\d{3,4}p)", quality_text)
        if match:
            quality = int(match.group(1).replace("p", ""))
            quality_links.append((quality, link))

    if not quality_links:
        return None

    # اختيار أعلى جودة
    best_quality = max(quality_links, key=lambda x: x[0])
    best_url = best_quality[1]

    # استخراج الرابط النهائي من صفحة ad.php
    return resolve_final_download_url(best_url)


def scrape_series_download(series_url):
    """جلب جميع الحلقات وروابط التحميل بشكل متوازي"""
    r = session.get(series_url)
    if r.status_code != 200:
        return {"error": "فشل في تحميل صفحة المسلسل"}

    soup = BeautifulSoup(r.text, "html.parser")
    episodes = soup.select("div.Episodes--Seasons--Episodes a")

    episodes_data = []

    tasks = {}
    with ThreadPoolExecutor(max_workers=10) as executor:
        for ep in episodes:
            ep_name = ep.select_one("episodetitle").text.strip()
            ep_url = ep.get("href")

            match = re.search(r"(\d+)", ep_name)
            ep_number = int(match.group(1)) if match else None

            future = executor.submit(get_best_download_url, ep_url)
            tasks[future] = (ep_name, ep_number)

        for future in as_completed(tasks):
            ep_name, ep_number = tasks[future]
            final_url = future.result()

            episodes_data.append({
                "Episoade_Name": ep_name,
                "episoade_order": ep_number,
                "url": final_url   # 🔑 مفتاح موحّد url
            })

    episodes_data.sort(key=lambda x: x["episoade_order"] if x["episoade_order"] else 0)

    return {
        "episodes": episodes_data,
        "success": True,
        "total_episodes": len(episodes_data)
    }


def scrape_movie_download(movie_url):
    """جلب اسم الفيلم ورابط التحميل الأعلى جودة"""
    r = session.get(movie_url)
    if r.status_code != 200:
        return {"error": "فشل في تحميل صفحة الفيلم"}

    soup = BeautifulSoup(r.text, "html.parser")

    # استخراج اسم الفيلم
    h1 = soup.select_one("h1[itemprop='name']")
    movie_name = h1.get_text(" ", strip=True) if h1 else "غير معروف"

    # تنظيف الاسم
    movie_name = movie_name.replace("مشاهدة فيلم", "").strip()
    movie_name = re.sub(r"\(.*?\)", "", movie_name).strip()

    best_url = get_best_download_url(movie_url)

    return {
        "Movie_Name": movie_name,
        "url": best_url,
        "success": True
    }


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

    data = scrape_series_download(series_url)
    return jsonify(data)


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

    data = scrape_movie_download(movie_url)
    return jsonify(data)


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