import yt_dlp
import os
import threading
import time
import subprocess
import glob

class MusicDownloader:
    def __init__(self, input_folder="canciones", output_folder="canciones mp3"):
        self.is_downloading = False
        self.log_messages = []
        self.current_progress = 0
        self.total_files = 0
        self.finished_files = 0
        self.error_files = 0
        self.input_folder = input_folder
        self.output_folder = output_folder
        
    def log(self, message):
        timestamp = time.strftime("%H:%M:%S")
        self.log_messages.append(f"[{timestamp}] {message}")
        if len(self.log_messages) > 100:
            self.log_messages.pop(0)

    def progress_hook(self, d):
        if d['status'] == 'downloading':
            try:
                p = d.get('_percent_str', '0%').replace('%','')
                self.current_progress = float(p)
            except:
                pass
        elif d['status'] == 'finished':
            self.log(f"Descarga completada: {d.get('filename', 'archivo')}")
            self.current_progress = 100

    def start_download(self, urls):
        if self.is_downloading:
            return False
        
        self.is_downloading = True
        self.log_messages = []
        self.finished_files = 0
        self.error_files = 0
        self.total_files = len(urls)
        
        thread = threading.Thread(target=self._download_process, args=(urls,))
        thread.start()
        return True

    def convert_files_to_mp3(self):
        if not os.path.exists(self.output_folder):
            os.makedirs(self.output_folder)
            self.log(f"Carpeta '{self.output_folder}' creada.")
            
        files = glob.glob(os.path.join(self.input_folder, "*"))
        total_files = len(files)
        
        if total_files == 0:
            self.log("No hay archivos para convertir.")
            return

        self.log(f"Iniciando conversión de {total_files} archivos a MP3...")
        
        ffmpeg_path = "ffmpeg"
        if os.name == 'nt':
            local_ffmpeg = os.path.join(os.getcwd(), "ffmpeg.exe")
            if os.path.exists(local_ffmpeg):
                ffmpeg_path = local_ffmpeg
            else:
                ffmpeg_path = "ffmpeg.exe"

        converted_count = 0
        
        for i, file_path in enumerate(files):
            try:
                if os.path.isdir(file_path):
                    continue
                    
                filename = os.path.basename(file_path)
                name, ext = os.path.splitext(filename)
                
                output_path = os.path.join(self.output_folder, f"{name}.mp3")
                
                if os.path.exists(output_path):
                    self.log(f"Saltando {filename} (ya existe en destino).")
                    continue
                
                self.log(f"Convirtiendo ({i+1}/{total_files}): {filename}")
                
                cmd = [
                    ffmpeg_path,
                    "-i", file_path,
                    "-vn",
                    "-acodec", "libmp3lame",
                    "-q:a", "2",
                    "-y",
                    output_path
                ]
                
                startupinfo = None
                if os.name == 'nt':
                     startupinfo = subprocess.STARTUPINFO()
                     startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
                
                subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, startupinfo=startupinfo, check=True)
                converted_count += 1
                
            except Exception as e:
                self.log(f"Error convirtiendo {filename}: {str(e)}")

        self.log(f"Conversión finalizada. {converted_count} archivos guardados en '{self.output_folder}'.")

    def _download_process(self, urls):
        self.log("Iniciando proceso de descarga...")
        
        if not os.path.exists(self.input_folder):
            os.makedirs(self.input_folder)
            self.log(f"Carpeta '{self.input_folder}' creada.")

        ffmpeg_location = ""
        if os.name == 'nt':
            ffmpeg_location = os.getcwd()

        ydl_opts = {
            'format': 'bestaudio/best',
            'ffmpeg_location': ffmpeg_location,
            'postprocessors': [{
                'key': 'FFmpegExtractAudio',
                'preferredcodec': 'mp3',
                'preferredquality': '192',
            }],
            'outtmpl': os.path.join(self.input_folder, '%(title)s.%(ext)s'),
            'progress_hooks': [self.progress_hook],
            'ignoreerrors': True,
            'quiet': True,
            'no_warnings': True,
        }

        with yt_dlp.YoutubeDL(ydl_opts) as ydl:
            for i, url in enumerate(urls):
                try:
                    self.log(f"Procesando ({i+1}/{len(urls)}): {url}")
                    self.current_progress = 0
                    ydl.download([url])
                    self.finished_files += 1
                except Exception as e:
                    self.log(f"ERROR en {url}: {str(e)}")
                    self.error_files += 1
        
        self.convert_files_to_mp3()
        self.is_downloading = False
        self.log("¡Proceso finalizado!")
        self.log(f"Resumen: {self.finished_files} descargados, {self.error_files} errores.")

# Instancia global (será re-inicializada en app.py si es necesario)
downloader = MusicDownloader()

