import requests
import json
import os
import time
import random
from flask import Flask, jsonify
from datetime import datetime, timedelta
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.triggers.interval import IntervalTrigger

app = Flask(__name__)

# إعدادات API للنظام الجديد
BASE_API_URL = 'https://iptv.xonegold.com/add'  # استبدل بعنوان API الخاص بك
EPISODE_API_URL = f'{BASE_API_URL}/add_episode'
STREAM_LINK_API_URL = f'{BASE_API_URL}/add_stream_link'
DOWNLOAD_LINK_API_URL = f'{BASE_API_URL}/add_download_link'

# البيانات الثابتة للحلقات
EPISODE_STATIC_DATA = {
    "episoade_image": "",
    "episoade_description": "",
    "downloadable": 1,  # تفعيل التحميل افتراضياً
    "type": 0,  # 0=NotPremium, 1=Premium
    "status": 1,  # 1=Released
    "source": "",
    "skip_available": 0,
    "intro_start": "",
    "intro_end": "",
    "end_credits_marker": "0",
    "drm_uuid": "",
    "drm_license_uri": ""
}

# البيانات الثابتة لروابط التشغيل
STREAM_LINK_STATIC_DATA = {
    "name": "سيرفر رئيسي جودة متعددة",
    "size": "",
    "quality": "1080p",
    "link_order": 1,
    "type": "M3u8",
    "status": 1,
    "skip_available": 0,
    "intro_start": "",
    "intro_end": "",
    "link_type": 0,  # 0=Free, 1=Premium
    "drm_uuid": "",
    "drm_license_uri": ""
}

# البيانات الثابتة لروابط التحميل
DOWNLOAD_LINK_STATIC_DATA = {
    "name": "تحميل مباشر",
    "size": "",
    "quality": "1080p",
    "link_order": 1,
    "type": "mp4",
    "download_type": "Internal",
    "status": 1
}

def load_series_links():
    """تحميل بيانات المسلسلات من ملف JSON"""
    try:
        with open('series_links.json', 'r', encoding='utf-8') as f:
            return json.load(f)
    except Exception as e:
        print(f"خطأ في قراءة ملف series_links.json: {str(e)}")
        return {}

def save_added_episode(series_name, episode_order):
    """حفظ الحلقات المضافة لتجنب التكرار"""
    try:
        if os.path.exists('added_episodes.json'):
            with open('added_episodes.json', 'r', encoding='utf-8') as f:
                data = json.load(f)
        else:
            data = {}
        
        if series_name not in data:
            data[series_name] = []
        
        if episode_order not in data[series_name]:
            data[series_name].append(episode_order)
        
        with open('added_episodes.json', 'w', encoding='utf-8') as f:
            json.dump(data, f, ensure_ascii=False, indent=4)
    except Exception as e:
        print(f"خطأ في حفظ الحلقات المضافة: {str(e)}")

def is_episode_added(series_name, episode_order):
    """التحقق مما إذا كانت الحلقة قد أضيفت مسبقاً"""
    try:
        if os.path.exists('added_episodes.json'):
            with open('added_episodes.json', 'r', encoding='utf-8') as f:
                data = json.load(f)
                return series_name in data and episode_order in data[series_name]
        return False
    except Exception as e:
        print(f"خطأ في التحقق من الحلقات المضافة: {str(e)}")
        return False

def fetch_episodes_data(series_name):
    """جلب بيانات الحلقات من API المصدر باستخدام اسم المسلسل"""
    try:
        api_url = f'https://iptv.xonegold.com/vidguard/go?series_name={series_name}'
        response = requests.get(api_url, timeout=30)
        response.raise_for_status()
        
        # تحويل البيانات إلى الشكل المطلوب
        episodes = response.json()
        formatted_episodes = []
        for episode in episodes:
            formatted_episodes.append({
                "episode_name": episode.get("episode_name", ""),
                "episode_order": episode.get("episode_order", 1),
                "url": episode.get("url", "")
            })
        return formatted_episodes
    except Exception as e:
        print(f"خطأ في جلب بيانات الحلقات لـ {series_name}: {str(e)}")
        return []

def add_episode_to_system(series_name, season_id, episode_data):
    """إضافة حلقة جديدة إلى النظام"""
    try:
        # تحضير بيانات الحلقة
        episode_payload = EPISODE_STATIC_DATA.copy()
        episode_payload.update({
            "season_id": season_id,
            "Episoade_Name": episode_data.get("episode_name", ""),
            "episoade_order": episode_data.get("episode_order", 1),
            "episoade_image": "",
            "episoade_description": "",
            "url": ""
        })

        # إرسال طلب إضافة الحلقة
        response = requests.post(EPISODE_API_URL, json=episode_payload)
        response.raise_for_status()
        
        result = response.json()
        episode_id = result.get("episode_id")
        
        if episode_id:
            print(f"تمت إضافة الحلقة {episode_payload['Episoade_Name']} بنجاح (ID: {episode_id})")
            return episode_id
        else:
            print(f"فشل في إضافة الحلقة: {result.get('error', 'Unknown error')}")
            return None
    except Exception as e:
        print(f"خطأ في إضافة الحلقة: {str(e)}")
        return None

def add_stream_link(episode_id, episode_data):
    """إضافة رابط تشغيل للحلقة"""
    try:
        stream_payload = STREAM_LINK_STATIC_DATA.copy()
        stream_payload.update({
            "episode_id": episode_id,
            "url": episode_data.get("url", ""),
            "name": "سيرفر 1"
        })

        response = requests.post(STREAM_LINK_API_URL, json=stream_payload)
        response.raise_for_status()
        
        result = response.json()
        if result.get("message"):
            print(f"تمت إضافة رابط التشغيل بنجاح للحلقة ID: {episode_id}")
            return True
        else:
            print(f"فشل في إضافة رابط التشغيل: {result.get('error', 'Unknown error')}")
            return False
    except Exception as e:
        print(f"خطأ في إضافة رابط التشغيل: {str(e)}")
        return False

def add_download_link(episode_id, episode_data):
    """إضافة رابط تحميل للحلقة"""
    try:
        download_payload = DOWNLOAD_LINK_STATIC_DATA.copy()
        download_payload.update({
            "episode_id": episode_id,
            "url": episode_data.get("url", ""),
            "name": f"تحميل {episode_data.get('episode_name', '')}"
        })

        response = requests.post(DOWNLOAD_LINK_API_URL, json=download_payload)
        response.raise_for_status()
        
        result = response.json()
        if result.get("message"):
            print(f"تمت إضافة رابط التحميل بنجاح للحلقة ID: {episode_id}")
            return True
        else:
            print(f"فشل في إضافة رابط التحميل: {result.get('error', 'Unknown error')}")
            return False
    except Exception as e:
        print(f"خطأ في إضافة رابط التحميل: {str(e)}")
        return False

def process_series(series_name, season_id):
    """معالجة مسلسل واحد وإضافة حلقاته"""
    print(f"بدأ معالجة المسلسل: {series_name} (الموسم ID: {season_id})")
    
    episodes = fetch_episodes_data(series_name)
    if not episodes:
        print(f"لا توجد حلقات متاحة للمسلسل: {series_name}")
        return
    
    print(f"تم جلب {len(episodes)} حلقة للمسلسل: {series_name}")
    
    for episode in episodes:
        episode_order = episode.get("episode_order")
        
        # التحقق من عدم إضافة الحلقة مسبقاً
        if is_episode_added(series_name, episode_order):
            print(f"الحلقة {episode_order} موجودة بالفعل، تم تخطيها")
            continue
        
        # إضافة الحلقة
        episode_id = add_episode_to_system(series_name, season_id, episode)
        if not episode_id:
            continue
        
        # إضافة روابط التشغيل والتحميل
        add_stream_link(episode_id, episode)
        add_download_link(episode_id, episode)
        
        # حفظ الحلقة المضافة
        save_added_episode(series_name, episode_order)
        
        # إضافة تأخير عشوائي بين الطلبات
        time.sleep(random.uniform(1, 3))
    
    print(f"تم الانتهاء من معالجة المسلسل: {series_name}")

def execute_script():
    """الدالة الرئيسية لتنفيذ السكربت"""
    print("بدأ تشغيل السكربت...")
    
    series_links = load_series_links()
    if not series_links:
        print("لا توجد مسلسلات للمعالجة في ملف series_links.json")
        return
    
    print(f"وجد {len(series_links)} مسلسل للمعالجة")
    
    for series_name, season_id in series_links.items():
        process_series(series_name, season_id)
        # إضافة تأخير عشوائي بين المسلسلات
        time.sleep(random.uniform(3, 7))
    
    print("اكتمل تنفيذ السكربت بنجاح")

@app.route('/start')
def start_script():
    """نقطة نهاية لبدء السكربت يدوياً"""
    execute_script()
    return jsonify({"status": "success", "message": "تم بدء السكربت بنجاح"})

# جدولة التشغيل التلقائي كل 12 ساعة
scheduler = BackgroundScheduler()
scheduler.add_job(
    execute_script,
    trigger=IntervalTrigger(hours=12),
    next_run_time=datetime.now() + timedelta(seconds=10)
)
scheduler.start()

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