#!/usr/bin/env bash
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

usage() {
    echo "Usage: $(basename "$0") [--tags tag1 tag2 ...] [--no-kebab] <file_or_folder>"
    exit 1
}

tags=()
target=""
kebab=1

while [[ $# -gt 0 ]]; do
    case "$1" in
        --no-kebab)
            kebab=0
            shift
            ;;
        --tags|-t)
            shift
            while [[ $# -gt 0 && "$1" != -* && ! -e "$1" ]]; do
                tags+=("$1")
                shift
            done
            ;;
        -*)
            echo "Unknown option: $1" >&2
            usage
            ;;
        *)
            target="$1"
            shift
            ;;
    esac
done

[[ -z "$target" ]] && usage

# Preliminary pass: kebab-case every name under the target and repair the
# markdown links that pointed at the old ones, so conversion only ever writes
# alongside already-normalised siblings. The target itself may be renamed,
# hence reading the new path back.
if [[ $kebab -eq 1 ]]; then
    target=$(python3 "$SCRIPT_DIR/kebab-case.py" --emit-target "$target")
fi

MINERU_HEALTH_URL="${MINERU_HEALTH_URL:-http://localhost:8000/health}"
LLM_HEALTH_URL="${LLM_HEALTH_URL:-http://localhost:8500/v1/models}"

# Probe a server's health endpoint, retrying briefly to absorb short blips.
check_server() {
    local url="$1" name="$2"
    for attempt in 1 2 3 4 5; do
        if [[ "$(curl -s -o /dev/null -m 5 -w '%{http_code}' "$url")" == "200" ]]; then
            return 0
        fi
        echo "  ⚠ $name ($url) unreachable, attempt $attempt/5, retrying in 10s..." >&2
        sleep 10
    done
    return 1
}

# PDF/PPTX conversion depends on MinerU + the Qwen VLM; verify both are up
# before each file so an outage fails loudly instead of silently falling
# back to markitdown's built-in (image-less) converter.
check_servers() {
    check_server "$MINERU_HEALTH_URL" "MinerU" || { echo "ERROR: MinerU unreachable, aborting." >&2; exit 1; }
    check_server "$LLM_HEALTH_URL" "Qwen VLM" || { echo "ERROR: Qwen VLM unreachable, aborting." >&2; exit 1; }
}

process_file() {
    local file="$1"
    local filename dir stem ext hidden_dir md_file
    filename=$(basename "$file")
    dir=$(dirname "$file")
    ext="${filename##*.}"
    stem="${filename%.*}"
    stem_safe="${stem// /-}"
    hidden_dir="$dir/.$stem_safe"
    md_file="$dir/$stem_safe.md"

    if [[ "${ext,,}" == "pdf" || "${ext,,}" == "pptx" ]]; then
        check_servers
    fi

    mkdir -p "$hidden_dir"

    if [[ "${ext,,}" == "md" ]]; then
        cp "$file" "$hidden_dir/"
        md_file="$file"
    else
        markitdown -p "$file" -o "$md_file"
        mv "$file" "$hidden_dir/"
    fi

    # Prepend tags
    if [[ ${#tags[@]} -gt 0 ]]; then
        local tag_line tmp
        tag_line=$(printf ' #%s' "${tags[@]}")
        tag_line="${tag_line:1}"
        tmp=$(mktemp)
        { printf '%s\n\n' "$tag_line"; cat "$md_file"; } > "$tmp"
        mv "$tmp" "$md_file"
    fi

    # Append link to original
    printf '\n[🔗 Link to the original document](.%s/%s)\n' "$stem_safe" "$filename" >> "$md_file"

    echo "→ $md_file"
}

if [[ -f "$target" ]]; then
    process_file "$target"
elif [[ -d "$target" ]]; then
    while IFS= read -r -d '' file; do
        process_file "$file"
    done < <(find "$target" -type f -not -path '*/.*/*' \
        \( -iname "*.pdf" -o -iname "*.pptx" -o -iname "*.docx" \
           -o -iname "*.xlsx" -o -iname "*.md" \) -print0)
else
    echo "Error: '$target' is not a file or directory" >&2
    exit 1
fi
