#!/usr/bin/env bash
# Copyright (BSD) 2021-2026, S.Johansson <starwave0812@gmail.com>

declare -x bkpIFS="$IFS"
trap 'export IFS="$bkpIFS"; rm -f "$TMP_LOG"' EXIT

TMP_LOG=$(mktemp /tmp/clvid.XXXXXX.log)
DATE_FORMAT=$(date +%Y-%m-%d.%H.%M)
FINAL_LOG="clvid.$DATE_FORMAT.log"

FLAG_GATHER=0
FLAG_AUTOLOG=0

# Voidflow.tech TrueColor CSS Mapping
DEFAULT="\e[0m"
BOLD="\e[1m"
NUKE_GREEN="\e[38;2;0;255;65m"
DEB_MAGENTA="\e[38;2;215;10;83m"
GOLD="\e[38;2;255;215;0m"
GREY="\e[38;2;170;170;170m"

while [[ -n $1 ]]; do
    case "$1" in
        -f|-d|folder|directory)
            FLAG_GATHER=1
            echo -e "${NUKE_GREEN}Gather mode activated. Files will be moved post-review.${DEFAULT}"
            shift ;;
        -l|--log)
            FLAG_AUTOLOG=1
            echo -e "${NUKE_GREEN}Auto-logging activated.${DEFAULT}"
            shift ;;
        *) shift ;;
    esac
done

panicquit() { echo -e "${DEB_MAGENTA}PANIC:${DEFAULT} $*"; exit 1; }

msg_info() { echo -e "${GOLD}[ INFO ]${DEFAULT} $1"; }
msg_success() { echo -e "${NUKE_GREEN}[  OK  ]${DEFAULT} $1"; }
msg_warning() { echo -e "${GOLD}[ WARN ]${DEFAULT} $1"; }
msg_critical() { echo -e "${DEB_MAGENTA}[ CRIT ]${DEFAULT} $1" >&2; }

__raw_status() {
    local status="$1" color="$2"
    local cols=$(tput cols 2>/dev/null || echo 80)
    local pad=$(( cols - 15 ))
    tput cuu1 2>/dev/null || echo -ne "\e[1A"
    tput cuf $pad 2>/dev/null || echo -ne "\e[${pad}C"
    echo -e "[${BOLD}${color}${status}${DEFAULT}]"
}

draw_progress() {
    local current=$1 max=$2
    local cols=$(tput cols 2>/dev/null || echo 80)
    local count_str="[ $current / $max ]"
    
    local bar_len=$(( cols - ${#count_str} - 3 ))
    (( bar_len < 10 )) && bar_len=10
    
    local filled=$(( current * bar_len / max ))
    local empty=$(( bar_len - filled ))
    
    local bar_str=""
    [[ $filled -gt 0 ]] && bar_str=$(printf "%${filled}s" | tr ' ' '#')
    local empty_str=""
    [[ $empty -gt 0 ]] && empty_str=$(printf "%${empty}s" | tr ' ' '-')
    
    # Renderar mätaren med Debian Magenta
    printf "\r [%b%s%b%s]%s\n" "${DEB_MAGENTA}" "$bar_str" "${DEFAULT}" "$empty_str" "$count_str"
}

query() {
    local prompt="${1} [${NUKE_GREEN}y${DEFAULT}/${DEB_MAGENTA}N${DEFAULT}] " reply
    while true; do
        echo -ne "$prompt"
        read -r reply </dev/tty
        case "${reply,,}" in
            y|j) return 0 ;;
            n|"") return 1 ;;
        esac
    done
}

prompt_action() {
    local reply
    while true; do
        echo -ne "Action: [${NUKE_GREEN}S${DEFAULT}]ave / [${DEB_MAGENTA}D${DEFAULT}]elete / [${GREY}I${DEFAULT}]gnore ? "
        read -r reply </dev/tty
        case "${reply,,}" in
            s) return 0 ;;
            d) return 1 ;;
            i) return 2 ;;
        esac
    done
}

prompt_error_action() {
    local reply
    while true; do
        echo -ne "Playback failed. Action: [${DEB_MAGENTA}D${DEFAULT}]elete / [${GREY}I${DEFAULT}]gnore ? "
        read -r reply </dev/tty
        case "${reply,,}" in
            d) return 1 ;;
            i) return 2 ;;
        esac
    done
}

checkreq() {
    local reqfiles=""
    command -v mpv >/dev/null 2>&1 || reqfiles="$reqfiles mpv"
    
    if [[ -n "$reqfiles" ]]; then
        msg_critical "Missing dependencies: $reqfiles"
        query "Install missing packages via apt?" && \
            sudo apt update && sudo apt install -y $reqfiles || \
            panicquit "Cannot proceed without mpv."
    fi
}

rootorsu() {
    echo -e "${DEB_MAGENTA}ROOT DETECTED! -- Do not run this script as root! --${DEFAULT}"
    echo "Adjust permissions via chown instead if you lack write access."
}

printlogo() {
    echo -e "${DEB_MAGENTA}"
    cat << 'EOF'
  ___ _          _    _  
 / __| |_ ___ __(_)__| | 
| (__| | '_\ V /| / _` | 
 \___|_|_|  \_/ |_\__,_| 
EOF
    echo -e "${DEFAULT}"
    echo -e "> Version 4.0.2, Updated $(date +%F)\n"
}

mpvlauncher() {
    # --vf=tpad fryser sista framen i 1.5 sekunder
    mpv --terminal=no --cache-secs=1 --cache=auto --volume=50 \
        --audio-normalize-downmix=yes --video-align-y=0.5 \
        --video-align-x=0.5 --border=no --force-window=yes \
        --framedrop=decoder+vo --speed=1 --geometry=1280x720 \
        --vf=tpad=stop_mode=clone:stop_duration=1.5 "$1" &>/dev/null
}

write_final_log() {
    if [[ ! -s "$TMP_LOG" ]]; then return; fi

    local do_log=0
    if [[ $FLAG_AUTOLOG -eq 1 ]]; then
        do_log=1
    else
        echo
        query "Save execution log to $FINAL_LOG?" && do_log=1
    fi

    if [[ $do_log -eq 1 ]]; then
        echo "--- Clearvids Log $DATE_FORMAT ---" > "$FINAL_LOG"
        awk -F'|' '{
            if ($1 == "SAVE") { printf "RENAMED : %-30s -> %s\n", $2, $3 }
            else if ($1 == "DEL") { printf "REMOVED : %s\n", $2 }
            else if ($1 == "IGN") { printf "IGNORED : %s\n", $2 }
            else if ($1 == "ERR") { printf "ERROR   : %s\n", $2 }
        }' "$TMP_LOG" >> "$FINAL_LOG"
        msg_success "Log saved: $FINAL_LOG"
    fi
}

gatherindir() {
    local target_dir="Reviewed.Videos-$(date +%Y.%m.%d)"
    local count=0
    
    local saved_files
    readarray -t saved_files < <(awk -F'|' '$1=="SAVE" {print $3}' "$TMP_LOG")
    local total=${#saved_files[@]}

    if [[ $total -eq 0 ]]; then
        msg_info "No files to move."
        return
    fi

    mkdir -p "$target_dir"
    clear; printlogo
    msg_info "Gathering $total files into $target_dir..."

    for file in "${saved_files[@]}"; do
        if [[ -f "$file" ]]; then
            mv -- "$file" "$target_dir/"
            ((count++))
            draw_progress "$count" "$total"
        else
            msg_warning "File missing: $file"
        fi
    done
    
    echo
    msg_success "Gathering complete."
}

main() {
    clear
    local current_idx=0
    
    for recording in "${captures[@]}"; do
        ((current_idx++))
        clear; printlogo
        
        local currentsize=$(du -h "$recording" | awk '{print $1}')
        msg_info "Playing file : $recording"
        msg_info "Size         : $currentsize"
        
        draw_progress "$current_idx" "$CURRENT_MAX"
        
        mpvlauncher "$recording"
        local mpv_status=$?
        msg_info "Reviewed     : $recording"
        
        if [[ $mpv_status -eq 0 ]]; then
            prompt_action
            local action=$?
            
            if [[ $action -eq 0 ]]; then
                local new_name="SAVE-CLIP-$recording"
                mv -- "$recording" "$new_name"
                echo "SAVE|$recording|$new_name" >> "$TMP_LOG"
                __raw_status "  SAVED  " "$NUKE_GREEN"
            elif [[ $action -eq 1 ]]; then
                rm -- "$recording"
                echo "DEL|$recording|" >> "$TMP_LOG"
                __raw_status " DELETED " "$DEB_MAGENTA"
            else
                echo "IGN|$recording|" >> "$TMP_LOG"
                __raw_status " IGNORED " "$GREY"
            fi
        else
            msg_warning "Playback of $recording returned a non-zero exit code ($mpv_status)."
            prompt_error_action
            local err_action=$?
            
            if [[ $err_action -eq 1 ]]; then
                rm -- "$recording"
                echo "DEL|$recording|" >> "$TMP_LOG"
                __raw_status " DELETED " "$DEB_MAGENTA"
            else
                echo "ERR|$recording|" >> "$TMP_LOG"
                __raw_status " IGNORED " "$GREY"
            fi
        fi
        sleep 0.5
    done
}

[[ $UID -eq 0 ]] && rootorsu

checkreq

shopt -s nocaseglob nullglob
captures=(*.{mov,mkv,mp4,avi,wmv})
shopt -u nocaseglob nullglob
CURRENT_MAX=${#captures[@]}

if [[ $CURRENT_MAX -eq 0 ]]; then
    msg_warning "No video files found in the current directory."
    exit 0
fi

query "Found $CURRENT_MAX video files. Start review?"
if [[ $? -eq 0 ]]; then
    main
    [[ $FLAG_GATHER -eq 1 ]] && gatherindir
    write_final_log
else
    exit 0
fi
