import requests
import json
import time
import os
from tqdm import tqdm

# 🔹 CONFIGURATION 🔹
API_KEY = "lUCRvOPYXci0DOVAz61u"  # 🔑 Clé API AllDebrid
PROXY = "http://lClXMfmYmiIMtc2:8ww25795ye6RYjO@46.203.211.10:45803"  # 🔹 Proxy
MAGNET_FILE = "magnets.txt"  # 📂 Fichier contenant les magnets
MAGNET_NO_CACHE_FILE = "magnet_no_cache.json"  # 📂 Magnets non disponibles
OUTPUT_FILE = "magnets_files.json"  # 📂 Liens sauvegardés

# 🔹 URLs API AllDebrid 🔹
API_MAGNET_UPLOAD = "https://api.alldebrid.com/v4/magnet/upload"
API_MAGNET_STATUS = "https://api.alldebrid.com/v4.1/magnet/status"
API_MAGNET_FILES = "https://api.alldebrid.com/v4/magnet/files"
API_LINKS_SAVE = "https://api.alldebrid.com/v4/user/links/save"
API_MAGNET_DELETE = "https://api.alldebrid.com/v4/magnet/delete"

# 🔹 Configurer le proxy 🔹
PROXIES = {
    "http": PROXY,
    "https": PROXY
}

DEBUG = True  # 🔍 Mode Debugging

# 🔹 Extensions vidéo valides 🔹
VIDEO_EXTENSIONS = {".mkv", ".mp4", ".avi"}

# 🔹 Charger un fichier JSON 🔹
def load_json(filename):
    try:
        with open(filename, "r", encoding="utf-8") as f:
            return json.load(f)
    except FileNotFoundError:
        return []
    except json.JSONDecodeError:
        return []

# 🔹 Sauvegarder un fichier JSON 🔹
def save_json(filename, data):
    with open(filename, "w", encoding="utf-8") as f:
        json.dump(data, f, indent=4, ensure_ascii=False)

# 🔹 Lire les magnets du fichier 🔹
def load_magnets():
    magnets = []
    with open(MAGNET_FILE, "r", encoding="utf-8") as f:
        for line in f:
            parts = line.strip().split(" | ")
            if len(parts) == 3:
                title, hash_value, magnet_link = parts
                if hash_value.lower() != "none":
                    magnets.append({"title": title, "hash": hash_value, "magnet": magnet_link})
    return magnets

# 🔹 Envoyer les magnets par groupes de 100 🔹
def upload_magnets(magnets):
    headers = {"Authorization": f"Bearer {API_KEY}"}
    uploaded_ids = []

    for i in range(0, len(magnets), 100):
        batch = magnets[i:i+100]
        magnet_links = [m["magnet"] for m in batch]

        print(f"\n📡 Envoi de {len(magnet_links)} magnets à AllDebrid...")

        response = requests.post(API_MAGNET_UPLOAD, headers=headers, proxies=PROXIES, data={"magnets[]": magnet_links})
        data = response.json()

        if DEBUG:
            print("\n🔍 **Réponse API Upload :**", json.dumps(data, indent=4))

        if data.get("status") == "success":
            for item in data["data"]["magnets"]:
                uploaded_ids.append(item["id"])
        else:
            print("❌ Erreur lors de l'envoi des magnets.")

    return uploaded_ids

# 🔹 Vérifier le statut des magnets 🔹
def check_magnet_status():
    headers = {"Authorization": f"Bearer {API_KEY}"}
    response = requests.post(API_MAGNET_STATUS, headers=headers, proxies=PROXIES)
    data = response.json()

    if DEBUG:
        print("\n🔍 **Réponse API Statut Magnets :**", json.dumps(data, indent=4))

    if not data or "data" not in data or "magnets" not in data["data"]:
        print("❌ Aucun magnet trouvé.")
        return [], []

    ready_magnets = []
    all_magnets = []

    for magnet in data["data"]["magnets"]:
        all_magnets.append(magnet["id"])
        if magnet["status"] == "Ready":
            ready_magnets.append(magnet)

    return ready_magnets, all_magnets

# 🔹 Récupérer les fichiers pour un ensemble de magnets 🔹
def fetch_magnet_files(magnet_ids):
    headers = {"Authorization": f"Bearer {API_KEY}"}
    payload = {"id[]": magnet_ids}

    print(f"\n📡 Récupération des fichiers pour {len(magnet_ids)} magnets...")

    response = requests.post(API_MAGNET_FILES, headers=headers, proxies=PROXIES, data=payload)
    data = response.json()

    if DEBUG:
        print("\n🔍 **Réponse API Fichiers :**", json.dumps(data, indent=4))

    if not data or "data" not in data or "magnets" not in data["data"]:
        print("❌ Erreur lors de la récupération des fichiers.")
        return []

    return data["data"]["magnets"]

# 🔹 Extraire les liens et sauvegarder 🔹
def extract_and_save_files(files_data):
    all_files = []

    def parse_tree(tree):
        for item in tree:
            if "e" in item:
                parse_tree(item["e"])
            else:
                file_ext = os.path.splitext(item["n"])[1].lower()
                if file_ext in VIDEO_EXTENSIONS:  # Vérification extension vidéo
                    all_files.append({
                        "filename": item["n"],
                        "size": round(item["s"] / (1024 * 1024 * 1024), 2),
                        "url": item["l"]
                    })

    for file_data in files_data:
        if "files" in file_data:
            parse_tree(file_data["files"])

    return all_files

# 🔹 Enregistrer les liens sur AllDebrid 🔹
def save_links(links):
    headers = {"Authorization": f"Bearer {API_KEY}"}
    payload = {"links[]": links}

    print(f"\n📡 Envoi des liens à AllDebrid... ({len(links)} liens)")

    response = requests.post(API_LINKS_SAVE, headers=headers, proxies=PROXIES, data=payload)
    data = response.json()

    if DEBUG:
        print("\n🔍 **Réponse API Enregistrement Liens :**", json.dumps(data, indent=4))

    return data.get("status") == "success"

# 🔹 Supprimer tous les magnets 🔹
def delete_magnets(magnet_ids):
    headers = {"Authorization": f"Bearer {API_KEY}"}

    for magnet_id in magnet_ids:
        payload = {"id": magnet_id}
        print(f"\n🗑️ Suppression du magnet ID: {magnet_id}")

        response = requests.post(API_MAGNET_DELETE, headers=headers, proxies=PROXIES, data=payload)
        data = response.json()

        if DEBUG:
            print("\n🔍 **Réponse API Suppression Magnet :**", json.dumps(data, indent=4))

# 🔹 Fonction principale 🔹
def process_magnets():
    magnets = load_magnets()
    uploaded_ids = upload_magnets(magnets)

    if not uploaded_ids:
        return

    print("⏳ Attente de 30 secondes pour la mise à jour des magnets...")
    time.sleep(30)

    ready_magnets, all_magnets = check_magnet_status()

    if ready_magnets:
        files_data = fetch_magnet_files([m["id"] for m in ready_magnets])
        extracted_files = extract_and_save_files(files_data)
        save_json(OUTPUT_FILE, extracted_files)

        links_to_save = [file["url"] for file in extracted_files]
        if save_links(links_to_save):
            delete_magnets(all_magnets)  # Suppression de tous les magnets

    print("✅ Processus terminé.")

# 🔹 Exécuter le script 🔹
if __name__ == "__main__":
    process_magnets()
