import requests
import json
import os
import time
import random
from flask import Flask, jsonify
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.triggers.interval import IntervalTrigger

app = Flask(__name__)

# البيانات الثابتة
static_data = {
    "episoade_image": "",
    "episoade_description": "",
    "downloadable": 0,
    "type": 0,
    "status": 1,
    "source": "Streamwish",
    "skip_available": 0,
    "intro_start": "",
    "intro_end": "",
    "end_credits_marker": 0,
    "drm_uuid": "UUID",
    "drm_license_uri": ""
}

# عنوان URL لنقطة النهاية لإضافة الحلقات
add_api_url = 'https://iptv.xonegold.com/add/add'

# جلب بيانات الحلقات من API المصدر باستخدام جلسة requests
def fetch_episodes(session, series_url, season_id):
    api_url = f'https://iptv.xonegold.com/farfesh/go?series_url={series_url}'
    try:
        source_response = session.get(api_url)
        if source_response.status_code == 200:
            try:
                data = source_response.json()
                episodes = []
                for episode in data:
                    episode_data = {
                        "episode_image": episode.get("episode_image", ""),
                        "episode_link": episode.get("episode_link", ""),
                        "episode_name": episode.get("episode_name", ""),
                        "episode_order": episode.get("episode_order", ""),
                        "url": episode.get("url", "")
                    }
                    episodes.append(episode_data)
                return episodes, season_id
            except json.JSONDecodeError:
                print(f"لا يمكن تحليل البيانات كـ JSON لـ {series_url}: {source_response.text}")
                return [], season_id
        else:
            print(f"حدث خطأ في جلب بيانات الحلقات من {series_url}: {source_response.status_code} - {source_response.text}")
            return [], season_id
    except requests.RequestException as e:
        print(f"حدث خطأ غير متوقع أثناء جلب بيانات الحلقات من {series_url}: {str(e)}")
        return [], season_id

# إضافة الحلقة إلى القائمة المضافة سابقاً
def add_to_previous_episodes(series_url, episode_id):
    previous_episodes = read_previous_episodes()
    if series_url not in previous_episodes:
        previous_episodes[series_url] = []
    if episode_id not in previous_episodes[series_url]:
        previous_episodes[series_url].append(episode_id)
    save_previous_episodes(previous_episodes)

# قراءة الحلقات المضافة سابقاً
def read_previous_episodes():
    if os.path.exists('save_episodes_data.json'):
        with open('save_episodes_data.json', 'r', encoding='utf-8') as file:
            return json.load(file)
    else:
        return {}

# حفظ الحلقات المضافة سابقاً
def save_previous_episodes(previous_episodes):
    with open('save_episodes_data.json', 'w', encoding='utf-8') as file:
        json.dump(previous_episodes, file, ensure_ascii=False, indent=4)

# إرسال البيانات إلى نقطة النهاية لإضافة الحلقات
def add_episode(session, data):
    try:
        response = session.post(add_api_url, json=data)
        if response.status_code == 200:
            print(f"تمت إضافة الحلقة {data['Episoade_Name']} بنجاح!")
            add_to_previous_episodes(data['series_url'], data['episoade_order'])
        else:
            print(f"حدث خطأ في إضافة الحلقة {data['Episoade_Name']}: {response.status_code} - {response.text}")
    except Exception as e:
        print(f"حدث خطأ غير متوقع أثناء إضافة الحلقة {data['Episoade_Name']}: {str(e)}")

# قراءة روابط المسلسلات وأرقام season_id من ملف JSON وإضافة المسلسلات بالترتيب المحدد
def read_series_data(file_path):
    with open(file_path, 'r', encoding='utf-8') as file:
        series_data = json.load(file)
        return series_data.items()

# الدالة الرئيسية لتنفيذ السكربت
def execute_script():
    print("Starting script automatically...")
    session = requests.Session()
    series_data = read_series_data('series_links.json')
    for series_url, season_id in series_data:
        episodes, season_id = fetch_episodes(session, series_url, season_id)
        print(f"جلبت {len(episodes)} حلقة من {series_url}")
        for episode in episodes:
            episode_id = episode.get("episode_order")
            if episode_id not in read_previous_episodes().get(series_url, []):
                data = static_data.copy()
                data.update({
                    "series_url": series_url,
                    "season_id": season_id,
                    "Episoade_Name": episode.get("episode_name"),
                    "episoade_order": episode_id,
                    "url": episode.get("url")
                })
                add_episode(session, data)
                # إضافة استراحة عشوائية بين الطلبات
                time.sleep(random.uniform(1, 5))
            else:
                print(f"الحلقة {episode_id} موجودة بالفعل في {series_url}")
        print_series_added(series_url)  # طباعة رسالة بعد انتهاء المسلسل
        # إضافة استراحة عشوائية بين المسلسلات
        time.sleep(random.uniform(5, 10))
    print("Script execution completed.")

# تشغيل السكربت بزيارة نقطة النهاية '/start'
@app.route('/start')
def start_script():
    execute_script()
    return jsonify({"message": "Script started successfully."})

# التحديث التلقائي كل 12 ساعة باستخدام APScheduler
scheduler = BackgroundScheduler()
scheduler.add_job(execute_script, trigger=IntervalTrigger(hours=1))
scheduler.start()

# طباعة رسالة بعد الانتهاء من كل مسلسل تم إضافته
def print_series_added(series_url):
    print(f"تمت إضافة جميع الحلقات من {series_url}")

if __name__ == '__main__':
    app.run(debug=True)