import os
import subprocess
import sys
import glob

# 1. .ins Datei im Ordner suchen
ins_files = glob.glob("*.ins")
if not ins_files:
    print("Fehler: Keine .ins-Datei im aktuellen Verzeichnis gefunden!")
    sys.exit(1)

ins_file = ins_files[0]
print(f"Gefundene Installations-Datei: {ins_file}")

# 2. Spielnamen abfragen
game_name = input("Bitte gib den Namen für die Spieldateien ein (z.B. AloneInTheDark3): ").strip()
if not game_name:
    game_name = os.path.splitext(ins_file)[0]

output_bin = f"{game_name}.bin"
output_cue = f"{game_name}.cue"

# 3. .ins Datei parsen, um Audiotracks und die gog-Datei zu finden
data_file = None
audio_tracks = []
current_file = None

with open(ins_file, "r", encoding="utf-8", errors="ignore") as f:
    for line in f:
        line_str = line.strip()
        if line_str.startswith("FILE"):
            parts = line_str.split('"')
            if len(parts) >= 2:
                current_file = parts[1]
        elif "TRACK" in line_str and "AUDIO" in line_str:
            parts = line_str.split()
            track_num = int(parts[1])
            audio_tracks.append((track_num, current_file))
        elif "TRACK" in line_str and ("MODE1" in line_str or "MODE2" in line_str):
            parts = line_str.split()
            track_num = int(parts[1])
            data_file = current_file

if not data_file or not os.path.exists(data_file):
    gog_files = glob.glob("*.gog")
    if gog_files:
        data_file = gog_files[0]
    else:
        print("Fehler: Konnte die Datendatei (.gog) nicht finden!")
        sys.exit(1)

# PICO-GUS FIX: Wir erzwingen MODE1/2352, da PicoGUS kein Mode 2 / XA unterstützt!
data_mode = "MODE1/2352"

print(f"\nStarte Konvertierung für PicoGUS:")
print(f" -> Datendatei: {data_file} (Erzwungener Modus: {data_mode})")
print(f" -> Audio-Tracks: {len(audio_tracks)} gefunden\n")

total_sectors = 0
tracks = []

# Track 1: Daten schreiben
data_size = os.path.getsize(data_file)
data_sectors = data_size // 2352
tracks.append((1, data_mode, 0, data_sectors))
total_sectors += data_sectors

with open(output_bin, "wb") as outfile:
    with open(data_file, "rb") as infile:
        outfile.write(infile.read())

# Audio-Tracks verarbeiten
for track_num, ogg_path in audio_tracks:
    ogg_path_clean = ogg_path.replace("\\", "/")
    if not os.path.exists(ogg_path_clean):
        print(f"Warnung: Audio-Datei {ogg_path_clean} nicht gefunden, überspringe...")
        continue

    raw_name = f"temp_track{track_num:02d}.raw"
    print(f"Konvertiere Track {track_num:02d} ({ogg_path_clean})...")

    subprocess.run([
        "ffmpeg", "-y", "-i", ogg_path_clean,
        "-f", "s16le", "-acodec", "pcm_s16le", "-ar", "44100", "-ac", "2",
        raw_name
    ], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)

    if os.path.exists(raw_name):
        raw_sectors = os.path.getsize(raw_name) // 2352
        tracks.append((track_num, "AUDIO", total_sectors, raw_sectors))

        with open(output_bin, "ab") as outfile:
            with open(raw_name, "rb") as infile:
                outfile.write(infile.read())

        total_sectors += raw_sectors
        os.remove(raw_name)

def sectors_to_msf(sectors):
    frames = sectors % 75
    total_seconds = sectors // 75
    seconds = total_seconds % 60
    minutes = total_seconds // 60
    return f"{minutes:02d}:{seconds:02d}:{frames:02d}"

# .cue Datei mit MODE1/2352 für die PicoGUS generieren
with open(output_cue, "w", encoding="utf-8") as cuefile:
    cuefile.write(f'FILE "{output_bin}" BINARY\n')
    for track_num, track_type, start_sector, _ in tracks:
        msf = sectors_to_msf(start_sector)
        cuefile.write(f"  TRACK {track_num:02d} {track_type}\n")
        cuefile.write(f"    INDEX 01 {msf}\n")

print("\n------------------------------------------")
print(f"Erfolg! PicoGUS-kompatible Dateien erstellt:")
print(f" -> {output_bin}")
print(f" -> {output_cue}")
