import os
import re
from moviepy.editor import VideoFileClip, concatenate_videoclips

def time_to_seconds(time_str):
    """Wandelt einen String wie '04:15' in Sekunden um."""
    parts = time_str.split(':')
    if len(parts) == 2:
        minutes, seconds = int(parts[0]), int(parts[1])
        return minutes * 60 + seconds
    elif len(parts) == 3:
        hours, minutes, seconds = int(parts[0]), int(parts[1]), int(parts[2])
        return hours * 3600 + minutes * 60 + seconds
    return 0

def extract_timestamps(llm_text):
    """Sucht im LLM-Text nach Mustern wie '00:00 - 00:10'."""
    pattern = r"(\d{1,2}:\d{2}(?::\d{2})?)\s*-\s*(\d{1,2}:\d{2}(?::\d{2})?)"
    matches = re.findall(pattern, llm_text)
    
    timestamps = []
    for match in matches:
        start_sec = time_to_seconds(match[0])
        end_sec = time_to_seconds(match[1])
        timestamps.append((start_sec, end_sec))
    
    return timestamps

def create_clips(video_path, llm_text, output_folder="output_videos"):
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
        
    timestamps = extract_timestamps(llm_text)
    
    if not timestamps:
        print("\n[Fehler] Konnte keine Timecodes im Text der KI finden!")
        return
        
    print(f"\n[Info] {len(timestamps)} Szenen für das Best-of Video gefunden.")
    
    try:
        print("\nLade Originalvideo in den Speicher...")
        master_clip = VideoFileClip(video_path)
        w, h = master_clip.size
        
        target_ratio = 9 / 16
        target_w = h * target_ratio
        
        clips_array = []
        
        for index, (start_t, end_t) in enumerate(timestamps):
            print(f">>> Verarbeite Szene {index + 1}: {start_t}s bis {end_t}s")
            
            # 1. Ausschneiden und Format anpassen (Mitte des Bildes, 9:16)
            subclip = master_clip.subclip(start_t, end_t).crop(x_center=w/2, y_center=h/2, width=target_w, height=h)
            
            # 2. Überblende (Crossfade) hinzufügen - außer beim allerersten Clip
            if index > 0:
                # 0.5 Sekunden weiche Überblende zum vorherigen Clip
                subclip = subclip.crossfadein(0.5)
                
            clips_array.append(subclip)
            
        print("\nSetze Szenen zusammen und rendere das finale Best-of Video...")
        # method="compose" ist wichtig, damit die Überblendungen (Crossfades) funktionieren
        # padding=-0.5 sorgt dafür, dass die Clips für die Überblende exakt eine halbe Sekunde überlappen
        final_video = concatenate_videoclips(clips_array, padding=-0.5, method="compose")
        
        final_clip_name = f"{output_folder}/Best_Of_Short_Final.mp4"
        
        # 3. Speichern
        final_video.write_videofile(
            final_clip_name, 
            codec="libx264", 
            audio_codec="aac", 
            fps=30,
            preset="fast",
            threads=4, # Nutzt mehrere CPU-Kerne für schnelleres Rendern unter Linux
            logger="bar"
        )
        
        # Speicher freigeben
        master_clip.close()
        final_video.close()
        print(f"\n[Erfolg] Das Best-of Video wurde erfolgreich gespeichert: '{final_clip_name}'")
        
    except Exception as e:
        print(f"\n[Fehler] Beim Videoschnitt ist ein Problem aufgetreten: {e}")
