#!/bin/bash

DIR="/data/2026"
DB="$DIR/converted.txt"
LOG="$DIR/convert.log"

touch "$DB"
touch "$LOG"

TOTAL=0
SUCCESS=0
FIXED=0
SKIPPED=0
FAILED=0

echo "============================================================"
echo "                 MKV → MP4 CONVERTER"
echo "============================================================"
echo "Directory : $DIR"
echo "Database  : $DB"
echo "Started   : $(date)"
echo "============================================================"

while IFS= read -r -d '' MKV; do

    TOTAL=$((TOTAL + 1))

    BASENAME="$(basename "$MKV" .mkv)"
    MP4="$DIR/$BASENAME.mp4"

    echo ""
    echo "============================================================"
    echo "[$TOTAL] $BASENAME"
    echo "============================================================"

    # ========================================================
    # DOUBLE CHECK
    # ========================================================

    echo "[CHECK] Checking actual file status..."

    MP4_OK=0

    if [ -s "$MP4" ]; then

        if ffprobe -v error \
            -select_streams v:0 \
            -show_entries stream=codec_name \
            -of csv=p=0 \
            "$MP4" >/dev/null 2>&1; then

            MP4_OK=1
            echo "[CHECK] MP4: OK"

        else

            echo "[CHECK] MP4: BROKEN"

        fi

    else

        echo "[CHECK] MP4: MISSING"

    fi

    # ========================================================
    # Check subtitle streams
    # ========================================================

    mapfile -t SUB_STREAMS < <(
        ffprobe -v error \
            -select_streams s \
            -show_entries stream=index \
            -of csv=p=0 \
            "$MKV"
    )

    SUB_COUNT=${#SUB_STREAMS[@]}

    echo "[CHECK] Subtitle streams: $SUB_COUNT"

    # ========================================================
    # If DB says converted
    # ========================================================

    if grep -Fxq "$BASENAME" "$DB"; then

        echo "[DB] Found in converted.txt"

        if [ "$MP4_OK" -eq 1 ]; then

            echo "[DB] MP4 exists and is valid"

            # ------------------------------------------------
            # Check subtitle files
            # ------------------------------------------------

            SUB_OK=1
            SUB_NUMBER=0

            if [ "$SUB_COUNT" -gt 0 ]; then

                for STREAM_INDEX in "${SUB_STREAMS[@]}"; do

                    LANG=$(
                        ffprobe -v error \
                            -select_streams "$STREAM_INDEX" \
                            -show_entries stream_tags=language \
                            -of default=noprint_wrappers=1:nokey=1 \
                            "$MKV" |
                        tr '[:upper:]' '[:lower:]' |
                        tr -d '[:space:]'
                    )

                    case "$LANG" in

                        fa|fas|per)
                            LANG="fa"
                            ;;

                        en|eng)
                            LANG="en"
                            ;;

                        uk|ukr|ua)
                            LANG="uk"
                            ;;

                        ar|ara)
                            LANG="ar"
                            ;;

                        tr|tur)
                            LANG="tr"
                            ;;

                        ru|rus)
                            LANG="ru"
                            ;;

                        de|deu|ger)
                            LANG="de"
                            ;;

                        fr|fra|fre)
                            LANG="fr"
                            ;;

                        es|spa)
                            LANG="es"
                            ;;

                        it|ita)
                            LANG="it"
                            ;;

                        *)
                            if [ "$SUB_NUMBER" -eq 0 ]; then
                                LANG="fa"
                            else
                                LANG="sub$((SUB_NUMBER + 1))"
                            fi
                            ;;
                    esac

                    VTT="$DIR/$BASENAME.$LANG.vtt"

                    if [ -s "$VTT" ]; then

                        echo "[CHECK] VTT OK: $(basename "$VTT")"

                    else

                        echo "[CHECK] VTT MISSING: $(basename "$VTT")"
                        SUB_OK=0

                    fi

                    SUB_NUMBER=$((SUB_NUMBER + 1))

                done

            fi

            # ------------------------------------------------
            # Everything exists
            # ------------------------------------------------

            if [ "$SUB_OK" -eq 1 ]; then

                echo "[CHECK] Everything looks good"

                echo "[DELETE] Removing leftover MKV..."

                if rm -f "$MKV"; then

                    if [ ! -f "$MKV" ]; then

                        echo "[OK] MKV deleted"
                        SUCCESS=$((SUCCESS + 1))

                    else

                        echo "[ERROR] MKV still exists"
                        FAILED=$((FAILED + 1))

                    fi

                fi

                continue

            fi

            # ------------------------------------------------
            # DB says done but subtitle missing
            # ------------------------------------------------

            echo "[FIX] Database says converted but VTT is missing"
            echo "[FIX] Re-extracting subtitles..."

        else

            echo "[FIX] Database says converted but MP4 is invalid"
            echo "[FIX] Rebuilding MP4..."

        fi

    fi

    # ========================================================
    # Create / Repair MP4
    # ========================================================

    if [ "$MP4_OK" -eq 0 ]; then

        echo ""
        echo "[MP4] Creating MP4..."
        echo "[MP4] Video: COPY"
        echo "[MP4] Audio: COPY"
        echo ""

        rm -f "$MP4"

        if ffmpeg \
            -nostdin \
            -hide_banner \
            -stats \
            -i "$MKV" \
            -map 0:v:0 \
            -map 0:a? \
            -c:v copy \
            -c:a copy \
            -movflags +faststart \
            "$MP4"; then

            echo ""
            echo "[OK] MP4 created"

        else

            echo ""
            echo "[ERROR] MP4 conversion failed"

            rm -f "$MP4"

            echo "$(date) | MP4 FAILED | $BASENAME" >> "$LOG"

            FAILED=$((FAILED + 1))
            continue

        fi

    else

        echo "[MP4] Existing MP4 is valid"
        echo "[MP4] No conversion required"

    fi

    # ========================================================
    # Verify MP4 again
    # ========================================================

    if ! ffprobe -v error \
        -select_streams v:0 \
        -show_entries stream=codec_name \
        -of csv=p=0 \
        "$MP4" >/dev/null 2>&1; then

        echo "[ERROR] Final MP4 verification failed"

        rm -f "$MP4"

        FAILED=$((FAILED + 1))
        continue

    fi

    echo "[CHECK] Final MP4 verification: OK"

    # ========================================================
    # Subtitle extraction
    # ========================================================

    SUB_FAILED=0
    SUB_NUMBER=0

    if [ "$SUB_COUNT" -gt 0 ]; then

        echo ""
        echo "[SUB] $SUB_COUNT subtitle stream(s) detected"

        for STREAM_INDEX in "${SUB_STREAMS[@]}"; do

            LANG=$(
                ffprobe -v error \
                    -select_streams "$STREAM_INDEX" \
                    -show_entries stream_tags=language \
                    -of default=noprint_wrappers=1:nokey=1 \
                    "$MKV" |
                tr '[:upper:]' '[:lower:]' |
                tr -d '[:space:]'
            )

            case "$LANG" in

                fa|fas|per)
                    LANG="fa"
                    ;;

                en|eng)
                    LANG="en"
                    ;;

                uk|ukr|ua)
                    LANG="uk"
                    ;;

                ar|ara)
                    LANG="ar"
                    ;;

                tr|tur)
                    LANG="tr"
                    ;;

                ru|rus)
                    LANG="ru"
                    ;;

                de|deu|ger)
                    LANG="de"
                    ;;

                fr|fra|fre)
                    LANG="fr"
                    ;;

                es|spa)
                    LANG="es"
                    ;;

                it|ita)
                    LANG="it"
                    ;;

                *)
                    if [ "$SUB_NUMBER" -eq 0 ]; then
                        LANG="fa"
                    else
                        LANG="sub$((SUB_NUMBER + 1))"
                    fi
                    ;;
            esac

            VTT="$DIR/$BASENAME.$LANG.vtt"

            echo ""
            echo "[SUB $((SUB_NUMBER + 1))/$SUB_COUNT]"
            echo "       Stream : $STREAM_INDEX"
            echo "       Lang   : $LANG"
            echo "       Output : $(basename "$VTT")"

            # ------------------------------------------------
            # Existing VTT double check
            # ------------------------------------------------

            if [ -s "$VTT" ]; then

                echo "[SUB] VTT already exists"
                echo "[SUB] Skipping extraction"

            else

                echo "[SUB] Extracting..."

                rm -f "$VTT"

                if ffmpeg \
                    -nostdin \
                    -hide_banner \
                    -stats \
                    -i "$MKV" \
                    -map 0:"$STREAM_INDEX" \
                    -c:s webvtt \
                    "$VTT"; then

                    echo ""
                    echo "[OK] VTT created"

                else

                    echo ""
                    echo "[ERROR] VTT extraction failed"

                    rm -f "$VTT"

                    SUB_FAILED=1

                    echo "$(date) | SUBTITLE FAILED | $BASENAME | stream=$STREAM_INDEX" >> "$LOG"

                    break

                fi

            fi

            # ------------------------------------------------
            # Verify VTT
            # ------------------------------------------------

            if [ ! -s "$VTT" ]; then

                echo "[ERROR] VTT verification failed"

                SUB_FAILED=1
                break

            fi

            echo "[CHECK] VTT verified"

            SUB_NUMBER=$((SUB_NUMBER + 1))

        done

    else

        echo ""
        echo "[SUB] No internal subtitle"
        echo "[SUB] No VTT required"

    fi

    # ========================================================
    # Subtitle failure
    # ========================================================

    if [ "$SUB_FAILED" -eq 1 ]; then

        echo ""
        echo "[FAILED] Subtitle processing failed"
        echo "[KEEP] MKV preserved"
        echo "[KEEP] converted.txt NOT updated"

        FAILED=$((FAILED + 1))

        continue
    fi

    # ========================================================
    # FINAL DOUBLE CHECK
    # ========================================================

    echo ""
    echo "[FINAL CHECK] Running final verification..."

    if [ ! -s "$MP4" ]; then

        echo "[FINAL ERROR] MP4 missing"
        FAILED=$((FAILED + 1))
        continue

    fi

    FINAL_SUB_OK=1

    if [ "$SUB_COUNT" -gt 0 ]; then

        SUB_NUMBER=0

        for STREAM_INDEX in "${SUB_STREAMS[@]}"; do

            LANG=$(
                ffprobe -v error \
                    -select_streams "$STREAM_INDEX" \
                    -show_entries stream_tags=language \
                    -of default=noprint_wrappers=1:nokey=1 \
                    "$MKV" |
                tr '[:upper:]' '[:lower:]' |
                tr -d '[:space:]'
            )

            case "$LANG" in
                fa|fas|per) LANG="fa" ;;
                en|eng) LANG="en" ;;
                uk|ukr|ua) LANG="uk" ;;
                ar|ara) LANG="ar" ;;
                tr|tur) LANG="tr" ;;
                ru|rus) LANG="ru" ;;
                de|deu|ger) LANG="de" ;;
                fr|fra|fre) LANG="fr" ;;
                es|spa) LANG="es" ;;
                it|ita) LANG="it" ;;
                *)
                    if [ "$SUB_NUMBER" -eq 0 ]; then
                        LANG="fa"
                    else
                        LANG="sub$((SUB_NUMBER + 1))"
                    fi
                    ;;
            esac

            VTT="$DIR/$BASENAME.$LANG.vtt"

            if [ ! -s "$VTT" ]; then
                echo "[FINAL ERROR] Missing VTT: $(basename "$VTT")"
                FINAL_SUB_OK=0
            fi

            SUB_NUMBER=$((SUB_NUMBER + 1))

        done

    fi

    if [ "$FINAL_SUB_OK" -eq 0 ]; then

        echo "[FINAL] Verification FAILED"
        echo "[KEEP] MKV preserved"

        FAILED=$((FAILED + 1))
        continue

    fi

    echo "[FINAL] Everything is OK"

    # ========================================================
    # Database
    # ========================================================

    if ! grep -Fxq "$BASENAME" "$DB"; then

        echo "$BASENAME" >> "$DB"

        echo "[DATABASE] Added"

    else

        echo "[DATABASE] Already exists"

    fi

    # ========================================================
    # Delete MKV
    # ========================================================

    echo ""
    echo "[DELETE] Deleting original MKV..."

    if rm -f "$MKV" && [ ! -f "$MKV" ]; then

        echo "[OK] MKV deleted"

        FIXED=$((FIXED + 1))
        SUCCESS=$((SUCCESS + 1))

    else

        echo "[ERROR] MKV could not be deleted"

        echo "$(date) | DELETE FAILED | $BASENAME" >> "$LOG"

        FAILED=$((FAILED + 1))

    fi

    # ========================================================
    # Status
    # ========================================================

    echo ""
    echo "------------------------------------------------------------"
    echo "STATUS"
    echo "Processed : $TOTAL"
    echo "Success   : $SUCCESS"
    echo "Fixed     : $FIXED"
    echo "Skipped   : $SKIPPED"
    echo "Failed    : $FAILED"
    echo "------------------------------------------------------------"

done < <(
    find "$DIR" -maxdepth 1 -type f -iname "*.mkv" -print0
)

echo ""
echo "============================================================"
echo "                     FINISHED"
echo "============================================================"
echo "Total    : $TOTAL"
echo "Success  : $SUCCESS"
echo "Fixed    : $FIXED"
echo "Skipped  : $SKIPPED"
echo "Failed   : $FAILED"
echo "Finished : $(date)"
echo "============================================================"
