#!/bin/bash
# FFmpeg Convert Suite 
# Features: Smart UI, Deep IDET Interlace Analysis, Smart BWDIF, Deblock, Film Grain, Vitality EQ, V/H Cropping, 2-Stage Autocrop, Auto-Chapters, A/V Fades, Dynamic Lanczos Scaling
# Concept and Testing by Glen MacArthur, coded by Google Gemini 3

generate_chapters() {
    cat <<EOF > /tmp/ff_chapters.txt
;FFMETADATA1
EOF
    for i in {0..36}; do
        START=$((i * 300 * 1000000))
        END=$(((i + 1) * 300 * 1000000))
        cat <<EOF >> /tmp/ff_chapters.txt
[CHAPTER]
TIMEBASE=1/1000000
START=$START
END=$END
title=Chapter $((i + 1))
EOF
    done
}

MODE=$(basename "$0")
[[ "$1" =~ ^--(mp4|mkv|mov|wav|mp3|mp4-remux|mkv-remux)$ ]] && MODE="$1" && shift

# 1. CONTEXTUAL SETTINGS (Defaults)
case "$MODE" in
    *mp4-remux*) EXT="mp4" ; DESC="MP4 (Copy Video/AAC 320k)" ; IS_VIDEO=true ; IS_REMUX=true ; BASE_OPTS="-c:v copy -c:a aac -b:a 320k -movflags +faststart" ;;
    *mkv-remux*) EXT="mkv" ; DESC="MKV (Copy Video/WAV 16-bit)" ; IS_VIDEO=true ; IS_REMUX=true ; BASE_OPTS="-c:v copy -c:a pcm_s16le" ;;
    *mp4*)       EXT="mp4" ; DESC="MP4 (H.264/AAC)" ; IS_VIDEO=true ; IS_REMUX=false ; BASE_OPTS="-c:v libx264 -preset slow -crf 20 -c:a aac -b:a 320k -movflags +faststart" ;;
    *mkv*)       EXT="mkv" ; DESC="MKV (H.264/WAV)" ; IS_VIDEO=true ; IS_REMUX=false ; BASE_OPTS="-c:v libx264 -preset slow -crf 20 -c:a pcm_s16le" ;;
    *mov*)       EXT="mov" ; DESC="MOV (ProRes/WAV)" ; IS_VIDEO=true ; IS_REMUX=false ; BASE_OPTS="-c:v prores_ks -profile:v 2 -c:a pcm_s16le" ;;
    *wav*)       EXT="wav" ; DESC="WAV (16-bit/48k)" ; IS_VIDEO=false ; IS_REMUX=false ; BASE_OPTS="-vn -c:a pcm_s16le -ar 48000" ;;
    *mp3*)       EXT="mp3" ; DESC="MP3 (320kbps)" ; IS_VIDEO=false ; IS_REMUX=false ; BASE_OPTS="-vn -c:a libmp3lame -b:a 320k" ;;
esac

# 2. SMART UI
DEINTERLACE="FALSE"; RUN_IDET="FALSE"; DEBLOCK="FALSE"; GRAIN="FALSE"; EQ_BUMP="FALSE"; V_CROP=0; H_CROP=0; AUTO_CROP="FALSE"; FORCE_FPS="FALSE"; RESCUE="FALSE"; APPLY_FADES="FALSE"; ADD_CHAPTERS="FALSE"
SCALE_W=0; SCALE_H=0

if [ "$IS_REMUX" = false ] || [[ "$MODE" == *"remux"* ]]; then
    YAD_ARGS=(--form --title="FFmpeg Convert Suite: $DESC" --image="/usr/local/share/icons/custom/ffmpeg-app.png" --window-icon="/usr/local/share/icons/custom/ffmpeg.png" --width=720 --center --text="<b>Encoding &amp; Processing Options for $DESC</b>")
    if [ "$IS_VIDEO" = true ]; then
        YAD_ARGS+=(--field="--- Restoration ---:RO" "" \
                    --field="Smart Deinterlace Source (BWDIF):CHK" "FALSE" \
                    --field="Deep Interlace Analysis (idet):CHK" "FALSE" \
                    --field="Enable Deblocking (spp):CHK" "FALSE" \
                    --field="--- Enhancement ---:RO" "" \
                    --field="Add Subtle Video Enhancement:CHK" "FALSE" \
                    --field="Enable CAS Sharpening:CHK" "FALSE" \
                    --field="Add Film Grain Filter:CHK" "FALSE" \
                    --field="--- Geometry ---:RO" "" \
                    --field="Top/Bottom Crop (Pixels):NUM" "0!0|1000|1" \
                    --field="Left/Right Crop (Pixels):NUM" "0!0|1000|1" \
                    --field="Smart Autocrop (Restore Aspect):CHK" "FALSE" \
                    --field="Scale Target Width (0 = Unset):NUM" "0!0|3840|2" \
                    --field="Scale Target Height (0 = Unset):NUM" "0!0|2160|2" \
                    --field="Force Constant 30fps:CHK" "FALSE" \
                    --field="Enable Frame Blend (60fps-30fps):CHK" "FALSE" \
                    --field="--- Output Options ---:RO" "" \
                    --field="Apply 1s Fade In/Out (A/V):CHK" "FALSE" \
                    --field="Insert 5-Minute Auto-Chapters:CHK" "FALSE")
        
        YAD_OUT=$(yad "${YAD_ARGS[@]}" --button="Start":0 --button="Cancel":1)
        [[ $? -ne 0 ]] && exit 0
        
        # Exact Index Extraction Mapping
        DEINTERLACE=$(echo "$YAD_OUT" | cut -d'|' -f2)
        RUN_IDET=$(echo "$YAD_OUT" | cut -d'|' -f3)
        DEBLOCK=$(echo "$YAD_OUT" | cut -d'|' -f4)
        EQ_BUMP=$(echo "$YAD_OUT" | cut -d'|' -f6)
        CAS=$(echo "$YAD_OUT" | cut -d'|' -f7)
        GRAIN=$(echo "$YAD_OUT" | cut -d'|' -f8)
        V_CROP=$(echo "$YAD_OUT" | cut -d'|' -f10 | cut -d'.' -f1)
        H_CROP=$(echo "$YAD_OUT" | cut -d'|' -f11 | cut -d'.' -f1)
        AUTO_CROP=$(echo "$YAD_OUT" | cut -d'|' -f12)
        SCALE_W=$(echo "$YAD_OUT" | cut -d'|' -f13 | cut -d'.' -f1)
        SCALE_H=$(echo "$YAD_OUT" | cut -d'|' -f14 | cut -d'.' -f1)
        FORCE_FPS=$(echo "$YAD_OUT" | cut -d'|' -f15)
        RESCUE=$(echo "$YAD_OUT" | cut -d'|' -f16)
        APPLY_FADES=$(echo "$YAD_OUT" | cut -d'|' -f18)
        ADD_CHAPTERS=$(echo "$YAD_OUT" | cut -d'|' -f19)
    else
        YAD_ARGS+=(--field="Apply 1s Audio Fade In/Out:CHK" "FALSE")
        YAD_OUT=$(yad "${YAD_ARGS[@]}" --button="Start":0 --button="Cancel":1)
        [[ $? -ne 0 ]] && exit 0
        APPLY_FADES=$(echo "$YAD_OUT" | cut -d'|' -f1)
    fi
fi

IFS=$'\n' FILES=($(sort <<<"$*")); unset IFS
for INPUT in "${FILES[@]}"; do
    OUT="${INPUT%.*}_converted.${EXT}"; FILTERS=(); AUDIO_FILTERS=("loudnorm=I=-16:TP=-1.5"); CHAPTER_OPTS=""; TOTAL=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$INPUT")
    
# --- IDET ANALYSIS PASS (STRICT & BASE-10 COMPLIANT) ---
    CALCULATED_PARITY="auto"
    if [[ "$RUN_IDET" == "TRUE" ]]; then
        IDET_LOG=$(ffmpeg -i "$INPUT" -vf "idet" -frames:v 1000 -an -f null /dev/null 2>&1)
        
        TFF_STR=$(echo "$IDET_LOG" | grep -i "Repeated Fields" | awk '{print $3}' | sed 's/[^0-9]//g' | head -n1)
        BFF_STR=$(echo "$IDET_LOG" | grep -i "Repeated Fields" | awk '{print $5}' | sed 's/[^0-9]//g' | head -n1)
        
        TFF_INT=$((10#${TFF_STR:-0}))
        BFF_INT=$((10#${BFF_STR:-0}))
        
        if [ "$TFF_INT" -ge "$BFF_INT" ]; then
            CALCULATED_PARITY="tff"
        else
            CALCULATED_PARITY="bff"
        fi
        
        if [ "$TFF_INT" -gt 0 ] || [ "$BFF_INT" -gt 0 ]; then
            DEINTERLACE="TRUE"
        fi
    fi

    # 1. TIMING & GEOMETRY
    [[ "$APPLY_FADES" == "TRUE" && "$IS_VIDEO" == "true" && "$IS_REMUX" == "false" ]] && FILTERS+=("setpts=PTS-STARTPTS")
    if [[ "$AUTO_CROP" == "TRUE" && "$IS_VIDEO" == "true" ]]; then
        DETECTED_CROP=$(ffmpeg -ss 00:02:00 -t 30 -i "$INPUT" -vf "cropdetect=limit=24:round=16" -an -f null /dev/null 2>&1 | grep -o "crop=[0-9]*:[0-9]*:[0-9]*:[0-9]*" | tail -n 1)
        [[ -n "$DETECTED_CROP" ]] && FILTERS+=("$DETECTED_CROP")
    elif [[ "$V_CROP" -gt 0 || "$H_CROP" -gt 0 ]]; then
        FILTERS+=("crop=in_w-$((H_CROP*2)):in_h-$((V_CROP*2)):$H_CROP:$V_CROP")
    fi

    # 2. Restoration (Deinterlacing / Deblocking)
    if [[ "$DEINTERLACE" == "TRUE" ]]; then
        FILTERS+=("bwdif=mode=send_frame:parity=${CALCULATED_PARITY}:deint=1")
    fi
    [[ "$DEBLOCK" == "TRUE" ]] && FILTERS+=("spp=6")

    # 3. OPTIMAL RESIZING PIPELINE INTERPOLATION (Lanczos Scaling)
    if [[ "$IS_VIDEO" == "true" ]]; then
        if [[ "$SCALE_W" -gt 0 && "$SCALE_H" -gt 0 ]]; then
            FILTERS+=("scale=w=$SCALE_W:h=$SCALE_H:flags=lanczos+accurate_rnd")
        elif [[ "$SCALE_W" -gt 0 && "$SCALE_H" -eq 0 ]]; then
            FILTERS+=("scale=w=$SCALE_W:h=-2:flags=lanczos+accurate_rnd")
        elif [[ "$SCALE_W" -eq 0 && "$SCALE_H" -gt 0 ]]; then
            FILTERS+=("scale=w=-2:h=$SCALE_H:flags=lanczos+accurate_rnd")
        fi
    fi

    # 4. Color, Sharpening & Post-Processing Enhancements
    [[ "$EQ_BUMP" == "TRUE" ]] && FILTERS+=("eq=brightness=-0.05:contrast=1.2:gamma=1.2:saturation=1.2")
    [[ "$CAS" == "TRUE" ]]     && FILTERS+=("cas=strength=0.5")
    [[ "$GRAIN" == "TRUE" ]]   && FILTERS+=("noise=c0_strength=10:c0_flags=0x00000003:c1_strength=0:c2_strength=0:c3_strength=0")

    # 5. FIXED FADE ENGINE & CHAPTER MAPPING
    if [[ "$ADD_CHAPTERS" == "TRUE" ]]; then generate_chapters; CHAPTER_OPTS="-i /tmp/ff_chapters.txt -map_metadata 1"; fi
    
    if [[ "$APPLY_FADES" == "TRUE" && "$IS_REMUX" == "false" ]]; then
        # Dynamically evaluate the source framerate instead of predicting a static 45-frame window
        LOCAL_FPS=$(ffprobe -v error -select_streams v:0 -show_entries stream=r_frame_rate -of default=noprint_wrappers=1:nokey=1 "$INPUT" | bc -l)
        CURR_FRAMES=$(echo "$TOTAL * $LOCAL_FPS" | bc | cut -d'.' -f1)
        F_LEN=$(echo "$LOCAL_FPS" | bc | cut -d'.' -f1) # Scaled dynamically to match 1 full second
        O_START=$(( CURR_FRAMES - F_LEN ))
        [[ "$O_START" -lt 0 ]] && O_START=0
        
        if [[ "$IS_VIDEO" == "true" ]]; then
            FILTERS+=("fade=t=in:st=0:n=$F_LEN" "fade=t=out:st=$O_START:n=$F_LEN")
        fi
        AUDIO_FILTERS+=("afade=t=in:st=0:d=1" "afade=t=out:st=$(echo "$TOTAL - 1" | bc -l):d=1")
    fi
    
    # Force colorspace standard verification down-chain safely
    if [[ "$IS_VIDEO" == "true" ]]; then 
        FILTERS+=("format=yuv420p")
    fi

    # EXECUTION PIPELINE ASSEMBLY
    [[ ${#FILTERS[@]} -gt 0 ]] && IFS=',' VF_FINAL="-vf ${FILTERS[*]}" && unset IFS
    IFS=',' AF_FINAL="-af ${AUDIO_FILTERS[*]}" && unset IFS
    TOTAL_ADJ=$(awk "BEGIN {print $TOTAL * 1000000}")
    
    # FIX: If stream copy/remuxing is enabled, completely clear all A/V filter parameters
    if [ "$IS_REMUX" = true ]; then
        unset VF_FINAL
        unset AF_FINAL
    fi

    ffmpeg -y -i "$INPUT" $CHAPTER_OPTS $BASE_OPTS $VF_FINAL $AF_FINAL -progress - "$OUT" 2>&1 | \
    stdbuf -oL tr '\r' '\n' | grep --line-buffered "out_time_us=" | \
    awk -v total="$TOTAL_ADJ" -v file="$(basename "$OUT")" -v d="$DESC" '
    { split($0, a, "="); if (a[1] == "out_time_us") { val = a[2]; gsub(/[^0-9]/, "", val); if (total > 0 && val != "") { pct = int(100 * val / total); if (pct > 100) pct = 100; if (pct > 0) { print pct; print "# " d ": " file " (" pct "%)"; fflush(); } } } }' | \
    yad --progress --title="FFmpeg Convert Suite" --image="/usr/local/share/icons/custom/ffmpeg-app.png" --window-icon="/usr/local/share/icons/custom/ffmpeg.png" --width=500 --center --auto-close
    
    [[ ${PIPESTATUS[0]} -ne 0 ]] && yad --error --text="Conversion Failure on: $(basename "$INPUT")" && rm -f /tmp/ff_chapters.txt 2>/dev/null && continue
    rm -f /tmp/ff_chapters.txt
done
notify-send "Conversion Process Complete!" --icon="/usr/local/share/icons/custom/ffmpeg.png"
exit 0