#!/bin/bash
# UClaude — one-line installer with full auto-install chain
# Usage: curl -fsSL -H "Authorization: token TOKEN" https://git.sensey24.ru/aibot777/unlimitedcoding/raw/branch/master/claude/uclaude_install.sh -o /tmp/uclaude.sh && sudo bash /tmp/uclaude.sh
set -uo pipefail

# Error handler
error_handler() {
    local line_no=$1
    echo "ERROR: Command failed at line $line_no" >&2
    echo "Last command: $BASH_COMMAND" >&2
    echo "Exiting..." >&2
    exit 1
}

trap 'error_handler $LINENO' ERR

# Read-only access token for private repo (scoped: read:repository only)
GITEA_TOKEN="${GITEA_TOKEN:-cadffcb0a6a3be728ac1ff619bb40c86588f6837}"
REPO_URL="https://x-token:${GITEA_TOKEN}@git.sensey24.ru/aibot777/unlimitedcoding.git"
INSTALL_DIR="${UCLAUDE_DIR:-$HOME/unlimitedcoding}"

echo "=== UClaude Installer ==="
echo "  Install dir: $INSTALL_DIR"

# ---- Auto-install prerequisites ----

install_pkg() {
    # Try apt, then yum/dnf, then brew
    if command -v apt-get >/dev/null 2>&1; then
        apt-get update -qq && apt-get install -y -qq "$@"
    elif command -v dnf >/dev/null 2>&1; then
        dnf install -y -q "$@"
    elif command -v yum >/dev/null 2>&1; then
        yum install -y -q "$@"
    elif command -v brew >/dev/null 2>&1; then
        brew install "$@"
    else
        echo "ERROR: No package manager found. Install $* manually."
        return 1
    fi
}

need_sudo() {
    if [ "$(id -u)" -ne 0 ]; then
        echo "  Root privileges required to install packages."
        echo "  Re-run with sudo: curl -fsSL -H 'Authorization: token ${GITEA_TOKEN}' https://git.sensey24.ru/aibot777/unlimitedcoding/raw/branch/master/claude/uclaude_install.sh -o /tmp/uclaude.sh && sudo bash /tmp/uclaude.sh"
        exit 1
    fi
}

# Git
if ! command -v git >/dev/null 2>&1; then
    echo "  git not found, installing..."
    need_sudo
    install_pkg git
fi

# Python 3
if ! command -v python3 >/dev/null 2>&1; then
    echo "  python3 not found, installing..."
    need_sudo
    install_pkg python3
fi

# curl (needed for nodesource)
if ! command -v curl >/dev/null 2>&1; then
    echo "  curl not found, installing..."
    need_sudo
    install_pkg curl
fi

# Node.js — updater handles version check and auto-install
if ! command -v node >/dev/null 2>&1; then
    echo "  Node.js not found. Updater will auto-install."
fi

# ---- Clone / Update repo ----

if [ -d "$INSTALL_DIR/.git" ]; then
    echo "  Already cloned, updating..."
    cd "$INSTALL_DIR"
    git fetch --depth 1 origin master 2>/dev/null
    git reset --hard origin/master 2>/dev/null
else
    echo "  Cloning (shallow, sparse — only latest version)..."

    # Shallow clone without checkout
    git clone --depth 1 --no-checkout "$REPO_URL" "$INSTALL_DIR"
    cd "$INSTALL_DIR"

    # Enable sparse checkout: root + claude core files + index.json (first pass)
    git sparse-checkout init --no-cone
    git sparse-checkout set '/*' 'claude/*' '!claude/releases/v*'  'claude/releases/index.json'
    git checkout 2>/dev/null

    # Read latest version from index.json and add only that release dir
    if [ -f claude/releases/index.json ]; then
        VER=$(python3 -c "import json; print(json.load(open('claude/releases/index.json'))['latest'])")
        echo "  Latest version: v${VER}"
        git sparse-checkout add "claude/releases/v${VER}"
        git checkout 2>/dev/null
    fi
fi

echo ""
echo "  Updating repo to latest version before running updater..."
# Update repo to latest version BEFORE running updater (so we get latest MIN_NODE_VERSION fix)
cd "$INSTALL_DIR"
git fetch --depth 1 origin master 2>/dev/null
git reset --hard origin/master 2>/dev/null || git pull --quiet 2>/dev/null

echo "  Running updater..."

# Run updater (needs root for cli.js replacement + node install)
if [ "$(id -u)" -eq 0 ]; then
    python3 claude/uclaude_updater.py --force
else
    echo "  Root privileges required to install cli.js."
    sudo python3 claude/uclaude_updater.py --force
fi

echo ""
echo "=== Installation complete ==="
echo "  To update later: cd $INSTALL_DIR && sudo bash claude/uclaude_update.sh"
