import re
import subprocess
import os
import sys
import requests
import json
from pathlib import Path

def obtenir_duree_mp3(chemin_fichier, script_duration):
    """
    Exécute le script getDuration.sh pour obtenir la durée d'un fichier MP3.
    """
    try:
        # Exécute la commande avec source (.)
        cmd = f". {script_duration} {os.path.basename(chemin_fichier)}"
        result = subprocess.run(
            cmd,
            shell=True,
            executable='/bin/bash',
            capture_output=True,
            text=True,
            cwd=os.path.dirname(chemin_fichier)
        )
        
        # Récupère la durée depuis stdout
        duree = result.stdout.strip()
        return float(duree) if duree else None
        
    except Exception as e:
        print(f"Erreur pour {chemin_fichier}: {e}")
        return None


def appeler_api_meta(sid, duration):
    """
    Appelle l'API pour mettre à jour les métadonnées avec la durée.
    """
    try:
        url = f'https://emcitv.com/back/page/webservice/page-upload-meta.php?sid={sid}&duration={duration}'
        response = requests.get(url, timeout=10)
        
        if response.status_code == 200:
            meta = response.json()
            print(f"  → API réponse: {json.dumps(meta)}")
            return meta
        else:
            print(f"  → API erreur: Status {response.status_code}")
            return None
            
    except Exception as e:
        print(f"  → API erreur: {e}")
        return None


def extraire_info_fichiers(repertoire_audio, script_duration, appeler_api=True):
    """
    Parcourt le répertoire, extrait les IDs et obtient les durées.
    """
    resultats = []
    
    # Liste tous les fichiers .mp3 dans le répertoire
    fichiers_mp3 = [f for f in os.listdir(repertoire_audio) if f.endswith('.mp3')]
    
    for nom_fichier in sorted(fichiers_mp3):
        # Extrait l'ID (6 chiffres)
        match = re.search(r'-(\d{6})-', nom_fichier)
        if match:
            id_fichier = match.group(1)
            chemin_complet = os.path.join(repertoire_audio, nom_fichier)
            
            # Obtient la durée
            print(f"Traitement de {nom_fichier}...")
            duree = obtenir_duree_mp3(chemin_complet, script_duration)
            
            # Appelle l'API si demandé et si la durée est valide
            api_response = None
            if appeler_api and duree:
                duration_int = int(duree)  # Convertir en entier pour l'API
                print(f"  → Appel API pour sid={id_fichier}, duration={duration_int}")
                api_response = appeler_api_meta(id_fichier, duration_int)
            
            resultats.append({
                'id': id_fichier,
                'fichier': nom_fichier,
                'duree': duree,
                'api_response': api_response
            })
    
    return resultats


def exporter_csv(resultats, appeler_api, fichier_csv="durees_mp3.csv"):
    """
    Export les résultats en CSV.
    """
    with open(fichier_csv, 'w', encoding='utf-8') as f:
        f.write("ID,Fichier,Duree_secondes,Duree_minutes,API_Status\n")
        for r in resultats:
            duree_sec = r['duree'] if r['duree'] else ''
            duree_min = r['duree']/60 if r['duree'] else ''
            api_status = 'OK' if r['api_response'] else ('N/A' if not appeler_api else 'ERREUR')
            f.write(f"{r['id']},{r['fichier']},{duree_sec},{duree_min},{api_status}\n")
    print(f"\nRésultats exportés dans {fichier_csv}")


def main():
    # Parse les arguments
    repertoire_audio = None
    script_duration = "/www/upaudio.emciorganisation.com/www/getDuration.sh"
    appeler_api = True  # Par défaut : appels API activés
    exporter = False    # Par défaut : pas d'export CSV
    
    # Parse des arguments
    i = 1
    while i < len(sys.argv):
        arg = sys.argv[i]
        if arg == '--no-api':
            appeler_api = False
        elif arg in ['--export', '--csv']:
            exporter = True
        elif arg.startswith('--'):
            print(f"Option inconnue: {arg}")
            print("Usage: python script.py [repertoire] [script_duration] [--no-api] [--export]")
            sys.exit(1)
        elif repertoire_audio is None:
            repertoire_audio = arg
        elif script_duration == "/www/upaudio.emciorganisation.com/www/getDuration.sh":
            script_duration = arg
        i += 1
    
    # Répertoire par défaut : répertoire courant
    if repertoire_audio is None:
        repertoire_audio = os.getcwd()
    
    # Vérifications
    if not os.path.exists(repertoire_audio):
        print(f"ERREUR: Le répertoire {repertoire_audio} n'existe pas!")
        sys.exit(1)
    
    if not os.path.exists(script_duration):
        print(f"ERREUR: Le script {script_duration} n'existe pas!")
        sys.exit(1)
    
    print(f"Répertoire: {repertoire_audio}")
    print(f"Script de durée: {script_duration}")
    print(f"Appels API: {'OUI' if appeler_api else 'NON'}")
    print(f"Export CSV: {'OUI' if exporter else 'NON'}")
    print("\nExtraction des durées en cours...\n")
    
    # Extraction des informations
    resultats = extraire_info_fichiers(repertoire_audio, script_duration, appeler_api)
    
    if not resultats:
        print("Aucun fichier MP3 avec ID trouvé dans le répertoire!")
        sys.exit(0)
    
    # Affichage des résultats
    print("\n" + "=" * 120)
    print(f"{'ID':<10} {'Durée (sec)':<15} {'Durée (min)':<15} {'API Status':<15} {'Fichier'}")
    print("-" * 120)
    
    for r in resultats:
        if r['duree']:
            duree_min = r['duree'] / 60
            api_status = 'OK' if r['api_response'] else ('N/A' if not appeler_api else 'ERREUR')
            print(f"{r['id']:<10} {r['duree']:<15.2f} {duree_min:<15.2f} {api_status:<15} {r['fichier']}")
        else:
            print(f"{r['id']:<10} {'ERREUR':<15} {'ERREUR':<15} {'N/A':<15} {r['fichier']}")
    
    # Statistiques
    print("\n" + "=" * 120)
    durees_valides = [r['duree'] for r in resultats if r['duree']]
    if durees_valides:
        print(f"Total de fichiers: {len(resultats)}")
        print(f"Fichiers avec durée: {len(durees_valides)}")
        print(f"Durée totale: {sum(durees_valides)/60:.2f} minutes ({sum(durees_valides)/3600:.2f} heures)")
        print(f"Durée moyenne: {sum(durees_valides)/len(durees_valides)/60:.2f} minutes")
        
        if appeler_api:
            api_success = len([r for r in resultats if r['api_response']])
            print(f"Appels API réussis: {api_success}/{len(durees_valides)}")
    
    # Export CSV si demandé
    if exporter:
        exporter_csv(resultats, appeler_api)


if __name__ == "__main__":
    main()
