import requests
import json
from tqdm import tqdm

# 🔹 CONFIGURATION 🔹
API_KEY = "lUCRvOPYXci0DOVAz61u"  # 🔑 Clé API AllDebrid
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"
OUTPUT_FILE = "magnets_files.json"
DEBUG = True  # 🔍 Mode Debugging

# 🔹 Récupérer la liste des magnets actifs 🔹
def fetch_active_magnets():
    headers = {"Authorization": f"Bearer {API_KEY}"}
    response = requests.post(API_MAGNET_STATUS, headers=headers)
    data = response.json()

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

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

    # 🔹 Filtrer uniquement les magnets avec le statut "Ready"
    ready_magnets = [{"id": magnet["id"], "filename": magnet["filename"]} for magnet in data["data"]["magnets"] if magnet["status"] == "Ready"]

    if DEBUG:
        print(f"\n📌 **Magnets Ready** : {ready_magnets}")

    return ready_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}  # Envoi sous forme d'un tableau

    print(f"\n📡 Envoi de la requête `magnet/files` pour {len(magnet_ids)} magnets...")

    response = requests.post(API_MAGNET_FILES, headers=headers, 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(f"❌ Erreur lors de la récupération des fichiers pour les magnets.")
        return []

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

# 🔹 Extraire les fichiers des dossiers 🔹
def extract_files(files_data, magnet_filename):
    extracted_files = []

    def parse_tree(tree, parent_path=""):
        for item in tree:
            if "e" in item:  # C'est un dossier
                parse_tree(item["e"], parent_path + item["n"] + "/")
            else:  # C'est un fichier
                extracted_files.append({
                    "magnet_filename": magnet_filename,
                    "filename": parent_path + item["n"],
                    "size": round(item["s"] / (1024 * 1024 * 1024), 2),  # Convertir en GB
                    "url": item["l"]
                })

    parse_tree(files_data)
    return extracted_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, data=payload)
    data = response.json()

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

    if not data or data.get("status") != "success":
        print("❌ Erreur lors de l'enregistrement des liens.")
        return False

    print(f"✅ {len(links)} liens enregistrés avec succès.")
    return True

# 🔹 Supprimer un magnet après enregistrement 🔹
def delete_magnet(magnet_id):
    headers = {"Authorization": f"Bearer {API_KEY}"}
    payload = {"id": magnet_id}

    print(f"\n🗑️ Suppression du magnet ID: {magnet_id}")

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

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

    if not data or data.get("status") != "success":
        print(f"❌ Échec de la suppression du magnet ID {magnet_id}.")
        return False

    print(f"✅ Magnet ID {magnet_id} supprimé avec succès.")
    return True

# 🔹 Fonction principale 🔹
def process_magnets():
    print("📥 Récupération des magnets actifs...")
    magnets = fetch_active_magnets()

    if not magnets:
        return

    print(f"🔄 {len(magnets)} magnets trouvés. Récupération des fichiers...")

    all_files = []
    magnet_ids = [magnet["id"] for magnet in magnets]

    # 🔹 Récupérer les fichiers en une seule requête (correction du payload)
    files_data = fetch_magnet_files(magnet_ids)

    for file_data in tqdm(files_data, desc="🔄 Extraction des fichiers"):
        magnet_id = file_data["id"]
        magnet_filename = next((m["filename"] for m in magnets if m["id"] == magnet_id), "Unknown")

        if "files" in file_data and isinstance(file_data["files"], list):
            extracted_files = extract_files(file_data["files"], magnet_filename)
            all_files.extend(extracted_files)

    # 🔹 Extraire uniquement les URLs pour l'enregistrement
    links_to_save = [file["url"] for file in all_files]

    if not links_to_save:
        print("❌ Aucun lien valide trouvé.")
        return

    # 🔹 Enregistrer les liens et supprimer les magnets
    if save_links(links_to_save):
        for magnet in magnets:
            delete_magnet(magnet["id"])

    # 🔹 Sauvegarde dans un fichier JSON
    with open(OUTPUT_FILE, "w", encoding="utf-8") as f:
        json.dump(all_files, f, indent=4, ensure_ascii=False)

    print(f"✅ {len(all_files)} fichiers enregistrés dans `{OUTPUT_FILE}`")

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