#!/usr/bin/env bash
# ThreadLion Code — CLI installer
#
# One-liner install:
#   curl -fsSL https://raw.githubusercontent.com/vicky4github/threadlion-code/main/install.sh | bash
#
# Environment overrides:
#   THREADLION_VERSION=1.2.3   install a specific version (default: latest)
#   OLLAMA_HOST=http://...     use a remote Ollama server (default: localhost:11434)

set -euo pipefail

THREADLION_VERSION="${THREADLION_VERSION:-latest}"
INSTALL_DIR="$HOME/.threadlion"
RELEASES="https://github.com/vicky4github/threadlion-code/releases"
PRIMARY_MODEL="${THREADLION_MODEL:-deepseek-v4-pro:cloud}"
OLLAMA_HOST="${OLLAMA_HOST:-http://localhost:11434}"
OLLAMA_INSTALL_URL="https://ollama.com/install.sh"

RED='\033[0;31m'; YELLOW='\033[1;33m'; GREEN='\033[0;32m'
BOLD='\033[1m'; CYAN='\033[0;36m'; DIM='\033[2m'; RESET='\033[0m'

banner() {
    echo ""
    echo -e "${CYAN}${BOLD}"
    echo "  ╔════════════════════════════════╗"
    echo "  ║    ThreadLion Code Installer   ║"
    echo "  ║    Terminal AI Coding Agent    ║"
    echo "  ╚════════════════════════════════╝"
    echo -e "${RESET}"
}

info()  { echo -e "${BOLD}[threadlion]${RESET} $*"; }
ok()    { echo -e "${GREEN}  ✓${RESET} $*"; }
warn()  { echo -e "${YELLOW}  ⚠${RESET} $*"; }
error() { echo -e "${RED}  ✗ ERROR:${RESET} $*" >&2; exit 1; }
step()  { echo -e "\n${BOLD}── $* ${DIM}─────────────────────${RESET}"; }

banner

# ── Platform / arch ───────────────────────────────────────────────────────────

OS="$(uname -s)"; ARCH="$(uname -m)"
case "$OS" in
    Darwin) PLATFORM="macos" ;;
    Linux)  PLATFORM="linux" ;;
    *)      error "Unsupported OS: $OS" ;;
esac
case "$ARCH" in
    x86_64|amd64)   ARCH_TAG="x86_64"  ;;
    arm64|aarch64)  ARCH_TAG="arm64"   ;;
    *)              error "Unsupported arch: $ARCH" ;;
esac

# ── Resolve version ───────────────────────────────────────────────────────────

step "Resolving version"

if [[ "$THREADLION_VERSION" == "latest" ]]; then
    THREADLION_VERSION=$(curl -fsSL \
        "https://api.github.com/repos/vicky4github/threadlion-code/releases/latest" \
        | grep '"tag_name"' | head -1 | sed 's/.*"tag_name": *"\(.*\)".*/\1/')
    [[ -z "$THREADLION_VERSION" ]] && error "Could not resolve latest version. Check your network."
fi
ok "Version: $THREADLION_VERSION"

# ── Download pre-built binary ─────────────────────────────────────────────────

step "Downloading ThreadLion Code $THREADLION_VERSION"

BINARY_NAME="threadlion-${PLATFORM}-${ARCH_TAG}"
DOWNLOAD_URL="${RELEASES}/download/${THREADLION_VERSION}/${BINARY_NAME}"

mkdir -p "$INSTALL_DIR/bin"
BINARY_PATH="$INSTALL_DIR/bin/threadlion"

info "Downloading from GitHub Releases…"
if ! curl -fsSL "$DOWNLOAD_URL" -o "$BINARY_PATH"; then
    error "Download failed. URL: $DOWNLOAD_URL\nCheck that release $THREADLION_VERSION exists."
fi
chmod +x "$BINARY_PATH"
ok "Binary installed → $BINARY_PATH"

# ── Ollama ────────────────────────────────────────────────────────────────────

step "Checking Ollama"

# If user has a remote Ollama server, skip local install entirely
if [[ "$OLLAMA_HOST" != "http://localhost:11434" ]]; then
    ok "Using remote Ollama at $OLLAMA_HOST"
    OLLAMA_RUNNING=true
else
    OLLAMA_RUNNING=false
    if curl -sf "${OLLAMA_HOST}/api/tags" >/dev/null 2>&1; then
        OLLAMA_RUNNING=true
        ok "Ollama: running"
    elif command -v ollama &>/dev/null; then
        ok "Ollama: installed (not running)"
    else
        warn "Ollama not found — installing…"
        curl -fsSL "$OLLAMA_INSTALL_URL" | sh
        ok "Ollama installed."
    fi

    if [[ "$OLLAMA_RUNNING" == "false" ]]; then
        info "Starting Ollama…"
        ollama serve >/dev/null 2>&1 &
        for i in $(seq 1 12); do
            sleep 1
            if curl -sf "${OLLAMA_HOST}/api/tags" >/dev/null 2>&1; then
                ok "Ollama started."
                OLLAMA_RUNNING=true
                break
            fi
        done
        [[ "$OLLAMA_RUNNING" == "false" ]] && \
            warn "Ollama didn't respond — run 'ollama serve' manually."
    fi
fi

# ── Pull model ────────────────────────────────────────────────────────────────

step "Model: $PRIMARY_MODEL"

if [[ "$OLLAMA_RUNNING" == "true" ]]; then
    EXISTS=$(curl -sf "${OLLAMA_HOST}/api/tags" 2>/dev/null \
        | grep -o "\"name\":\"${PRIMARY_MODEL}\"" | head -1) || true
    if [[ -n "$EXISTS" ]]; then
        ok "Model already available."
    else
        info "Pulling $PRIMARY_MODEL (may take a few minutes)…"
        if command -v ollama &>/dev/null; then
            OLLAMA_HOST="$OLLAMA_HOST" ollama pull "$PRIMARY_MODEL" || \
                warn "Pull failed — run: ollama pull $PRIMARY_MODEL"
        else
            warn "ollama CLI not found — run: ollama pull $PRIMARY_MODEL"
        fi
        ok "Model ready."
    fi
else
    warn "Ollama not running — skipping model pull."
fi

# ── Save config ───────────────────────────────────────────────────────────────

step "Configuring"

mkdir -p "$INSTALL_DIR"
cat > "$INSTALL_DIR/config.env" <<ENV
OLLAMA_HOST=${OLLAMA_HOST}
THREADLION_MODEL=${PRIMARY_MODEL}
ENV
ok "Config written → $INSTALL_DIR/config.env"

# ── PATH setup ────────────────────────────────────────────────────────────────

step "Setting up PATH"

BIN_DIR="$INSTALL_DIR/bin"
EXPORT_LINE="export PATH=\"\$PATH:${BIN_DIR}\""

add_to_shell() {
    local rc="$1"
    [[ -f "$rc" ]] && grep -qF "$BIN_DIR" "$rc" 2>/dev/null || echo "$EXPORT_LINE" >> "$rc"
}
add_to_shell "$HOME/.zshrc"
add_to_shell "$HOME/.bashrc"
add_to_shell "$HOME/.profile"
export PATH="$PATH:$BIN_DIR"
ok "PATH updated."

# ── Verify ────────────────────────────────────────────────────────────────────

step "Verifying"

if command -v threadlion &>/dev/null || [[ -x "$BINARY_PATH" ]]; then
    ok "threadlion command ready"
else
    warn "threadlion not in PATH yet — run: source ~/.zshrc"
fi

# ── Done ──────────────────────────────────────────────────────────────────────

echo ""
echo -e "${GREEN}${BOLD}  ThreadLion Code ${THREADLION_VERSION} installed!${RESET}"
echo ""
echo -e "  ${BOLD}Start coding:${RESET}"
echo -e "    ${CYAN}threadlion${RESET}"
echo ""
if [[ "$OLLAMA_HOST" != "http://localhost:11434" ]]; then
echo -e "  ${BOLD}Using Ollama server:${RESET} ${DIM}${OLLAMA_HOST}${RESET}"
fi
echo -e "  ${BOLD}Model:${RESET} ${DIM}${PRIMARY_MODEL}${RESET}"
echo ""
