#!/bin/bash

echo "========== STARTING CWA-INGEST SERVICE =========="

WATCH_FOLDER=$(grep -o '"ingest_folder": "[^"]*' /app/calibre-web-automated/dirs.json | grep -o '[^"]*$')
echo "[cwa-ingest-service] Watching folder: $WATCH_FOLDER"

# Tunables (override via env)
STABLE_CHECKS=${CWA_INGEST_STABLE_CHECKS:-6}
STABLE_CONSEC_MATCH=${CWA_INGEST_STABLE_CONSEC_MATCH:-2}
STABLE_INTERVAL=${CWA_INGEST_STABLE_INTERVAL:-0.5}
SUPPORTED_EXT_REGEX='(epub|mobi|azw3|azw|pdf|txt|rtf|cbz|cbr|cb7|cbc|fb2|fbz|docx|html|htmlz|lit|lrf|odt|prc|pdb|pml|rb|snb|tcr|txtz|kepub|m4b|m4a|mp4|cwa.json)$'
TEMP_SUFFIXES='crdownload download part uploading'

wait_for_stable_file() {
        local file="$1" last_size="" same_count=0 i sz
        for (( i=0; i<STABLE_CHECKS; i++ )); do
                [ -f "$file" ] || return 1
                sz=$(stat -c %s "$file" 2>/dev/null || echo "") || return 1
                [ -n "$sz" ] || return 1
                if [ "$sz" = "$last_size" ]; then
                        same_count=$((same_count+1))
                        if [ $same_count -ge $((STABLE_CONSEC_MATCH-1)) ]; then
                                return 0
                        fi
                else
                        same_count=0
                        last_size="$sz"
                fi
                sleep "$STABLE_INTERVAL"
        done
        return 0
}

run_fallback() {
        echo "[cwa-ingest-service] Falling back to polling watcher" >&2
        python3 /app/calibre-web-automated/scripts/watch_fallback.py --path "$WATCH_FOLDER" --interval 5 |
        while read -r events filepath; do
                handle_event "$filepath"
        done
}

is_docker_desktop() {
        local osr mounts
        osr=$(cat /proc/sys/kernel/osrelease 2>/dev/null || true)
        echo "$osr" | grep -qi 'microsoft' && return 0
        echo "$osr" | grep -qi 'linuxkit' && return 0
        mounts=$(cat /proc/self/mountinfo 2>/dev/null || true)
        echo "$mounts" | grep -Eqi '/host_mnt/|/Users/|osxfs|virtiofs.*docker' && return 0
        return 1
}

handle_event() {
        local filepath="$1"
        # temp suffixes
        for suf in $TEMP_SUFFIXES; do
                [[ "$filepath" == *.$suf ]] && return 0
        done
        # extension filter
        if ! [[ "$filepath" =~ $SUPPORTED_EXT_REGEX ]]; then
                return 0
        fi
        
        echo "[cwa-ingest-service] New file detected - $filepath - Starting Ingest Processor..."
        python3 /app/calibre-web-automated/scripts/ingest_processor.py "$filepath"
}

if [ "${NETWORK_SHARE_MODE,,}" = "true" ] || [ "${NETWORK_SHARE_MODE}" = "1" ] || [ "${NETWORK_SHARE_MODE,,}" = "yes" ] || [ "${NETWORK_SHARE_MODE,,}" = "on" ]; then
        echo "[cwa-ingest-service] NETWORK_SHARE_MODE=true -> using fallback watcher"
        run_fallback; exit 0
fi

if [ "${CWA_WATCH_MODE:-inotify}" = "poll" ]; then
        run_fallback; exit 0
fi

if is_docker_desktop; then
        echo "[cwa-ingest-service] Docker Desktop detected -> using fallback watcher"
        run_fallback; exit 0
fi

( set -o pipefail
        s6-setuidgid abc inotifywait -m -r --format="%e %w%f" -e close_write -e moved_to "$WATCH_FOLDER" | \
        while read -r events filepath; do
                handle_event "$filepath"
        done
) || run_fallback

