#!/usr/bin/env bash
# create_dos_iso.sh - Erstellt MS-DOS-kompatible ISO 9660 Level 1 Images

set -e

SRC_DIR="${1%/}"
ISO_OUT="${2:-dos_cd.iso}"
VOL_NAME="${3:-DOS_CD}"

if [[ -z "$SRC_DIR" || ! -d "$SRC_DIR" ]]; then
    echo "Nutzung: $0 <Quellordner> [Ausgabe.iso] [VOLUMELABEL]"
    exit 1
fi

STAGE_DIR=$(mktemp -d /tmp/dos_iso_stage.XXXXXX)
trap 'rm -rf "$STAGE_DIR"' EXIT

echo "=== 1. Analyse und Vorbereitung für MS-DOS (8.3 & UPPERCASE) ==="

find "$SRC_DIR" -mindepth 1 | while read -r src_path; do
    rel_path="${src_path#$SRC_DIR/}"

    # 1. Verzeichnistiefe rein in Bash berechnen (robust ohne awk/tr)
    slashes="${rel_path//[^\/]}"
    depth=$(( ${#slashes} + 1 ))
    if [ "$depth" -gt 8 ]; then
        echo "⚠️  [WARNUNG] Verzeichnistiefe > 8 Ebenen: '$rel_path'"
    fi

    dirname=$(dirname "$rel_path")
    filename=$(basename "$rel_path")

    # 2. Ordnerpfad säubern (Jeden Ordner auf max. 8 Zeichen & UPPERCASE kürzen)
    if [ "$dirname" == "." ]; then
        target_dir="$STAGE_DIR"
    else
        clean_dir=""
        IFS='/' read -ra DIR_PARTS <<< "$dirname"
        for part in "${DIR_PARTS[@]}"; do
            clean_part=$(echo "$part" | tr '[:lower:]' '[:upper:]' | sed 's/[^A-Z0-9_]/_/g')
            clean_part="${clean_part:0:8}"
            clean_dir="${clean_dir:+$clean_dir/}$clean_part"
        done
        target_dir="$STAGE_DIR/$clean_dir"
    fi

    mkdir -p "$target_dir"

    # Ordner selbst nicht als Datei kopieren
    if [ -d "$src_path" ]; then
        continue
    fi

    # 3. Dateiname & Endung trennen
    if [[ "$filename" == *.* ]]; then
        base_name="${filename%.*}"
        ext="${filename##*.}"
    else
        base_name="$filename"
        ext=""
    fi

    # Säubern (nur A-Z, 0-9, _)
    clean_base=$(echo "$base_name" | tr '[:lower:]' '[:upper:]' | sed 's/[^A-Z0-9_]/_/g')
    clean_ext=$(echo "$ext" | tr '[:lower:]' '[:upper:]' | sed 's/[^A-Z0-9_]/_/g')
    clean_ext="${clean_ext:0:3}"

    # 4. Kollisionsfreie 8.3-Benennung (z. B. NGHOST61.IMA, NGHOST62.IMA bei Namensgleichheit)
    short_base="${clean_base:0:8}"
    if [ -n "$clean_ext" ]; then
        target_file="$target_dir/${short_base}.${clean_ext}"
    else
        target_file="$target_dir/${short_base}"
    fi

    counter=1
    while [ -e "$target_file" ]; do
        suffix="${counter}"
        prefix_len=$(( 8 - ${#suffix} ))
        short_base="${clean_base:0:$prefix_len}${suffix}"
        if [ -n "$clean_ext" ]; then
            target_file="$target_dir/${short_base}.${clean_ext}"
        else
            target_file="$target_dir/${short_base}"
        fi
        ((counter++))
    done

    target_name=$(basename "$target_file")

    if [ "$filename" != "$target_name" ]; then
        echo "⚠️  [WARNUNG] Name angepasst: '$filename' -> '$target_name'"
    fi

    cp "$src_path" "$target_file"
done

echo ""
echo "=== 2. Erstelle ISO 9660 Level 1 Image: $ISO_OUT ==="

clean_label=$(echo "$VOL_NAME" | tr '[:lower:]' '[:upper:]' | sed 's/[^A-Z0-9_]/_/g')
clean_label="${clean_label:0:32}"

genisoimage -iso-level 1 -pad -V "$clean_label" -o "$ISO_OUT" "$STAGE_DIR"

echo ""
echo "✅ ISO erfolgreich erstellt: $ISO_OUT"
