#!/bin/bash
# Blitz PKG Postinstall Script
# Sets up ~/.blitz directory and installs bundled toolchain pieces (Node, iPhone MCP, Python, idb).
#
# NOTE: The app itself (Blitz.app) is installed to /Applications by the PKG system,
# NOT by this script. This script only handles post-installation setup.

set -u  # Error on undefined variables (but not -e, we handle errors manually)

IS_ROOT=false
if [ "$(id -u)" = "0" ]; then
    IS_ROOT=true
fi

# Run a command as the console user.
run_as_user() {
    if [ "$IS_ROOT" = true ] && [ -n "${CONSOLE_UID:-}" ]; then
        launchctl asuser "$CONSOLE_UID" sudo -u "$CONSOLE_USER" "$@"
    else
        "$@"
    fi
}

LOG="/tmp/blitz_install.log"

export CI=true
export WRANGLER_SEND_METRICS=false

echo "" >> "$LOG"
echo "=== Blitz Postinstall $(date) ===" >> "$LOG"
T_POSTINSTALL_START=$(date +%s)

chmod 666 "$LOG" 2>/dev/null || true

show_error() {
    local message="$1"
    echo "FATAL: $message" >> "$LOG"
    run_as_user osascript \
        -e 'on run argv' \
        -e 'display dialog (item 1 of argv) with title "Blitz — Installation Failed" buttons {"OK"} default button "OK" with icon stop' \
        -e 'end run' \
        -- "$message" 2>/dev/null || true
}

fail() {
    show_error "$1"
    echo "=== Postinstall FAILED ===" >> "$LOG"
    exit 1
}

show_progress() {
    local message="$1"
    echo "PROGRESS: $message" >> "$LOG"
    run_as_user osascript \
        -e 'on run argv' \
        -e 'display notification (item 1 of argv) with title "Blitz Installer"' \
        -e 'end run' \
        -- "$message" 2>/dev/null || true
}

# Detect console user
CONSOLE_USER=$(echo "show State:/Users/ConsoleUser" | scutil | awk '/Name :/ { print $3 }')
CONSOLE_HOME=""
CONSOLE_UID=""
if [ -n "$CONSOLE_USER" ] && [ "$CONSOLE_USER" != "loginwindow" ]; then
    CONSOLE_HOME=$(eval echo "~$CONSOLE_USER")
    CONSOLE_UID=$(id -u "$CONSOLE_USER" 2>/dev/null)
fi

if [ -z "$CONSOLE_USER" ] || [ -z "$CONSOLE_UID" ]; then
    echo "FATAL: Could not detect console user" >> "$LOG"
    exit 1
fi

CONSOLE_TMPDIR=$(run_as_user getconf DARWIN_USER_TEMP_DIR 2>/dev/null || echo "/tmp")
echo "Console user: $CONSOLE_USER (UID $CONSOLE_UID, home $CONSOLE_HOME)" >> "$LOG"

APP_DIR="/Applications/Blitz.app"

# ----------------------------------------------------------------------------
# FIX PKG RELOCATION (can be removed once Tauri users have migrated)
# macOS Installer may relocate Blitz.app to a .localized subdirectory when
# stale pkg receipts from the old Tauri app exist. BundleIsRelocatable=false
# and pkgutil --forget in preinstall are not sufficient because the installer
# decides the install path BEFORE preinstall runs. Fix it after the fact.
# Also forget old receipts now so the NEXT install won't relocate again.
# ----------------------------------------------------------------------------
if [ ! -d "$APP_DIR" ]; then
    for d in /Applications/Blitz.localized /Applications/Blitz-*.localized; do
        if [ -d "$d/Blitz.app" ]; then
            echo "Fixing pkg relocation: moving $d/Blitz.app to $APP_DIR" >> "$LOG"
            mv "$d/Blitz.app" "$APP_DIR"
            rm -rf "$d"
            break
        fi
    done

    # Forget stale receipts so this doesn't happen on the next upgrade
    for OLD_ID in dev.blitz.mac dev1.blitz.mac; do
        pkgutil --forget "$OLD_ID" >> "$LOG" 2>&1 || true
    done
fi
# ----------------------------------------------------------------------------

RESOURCES_DIR="$APP_DIR/Contents/Resources"

# ============================================================================
# Install Node.js runtime to ~/.blitz/node-runtime
# ============================================================================

T_NODE_START=$(date +%s)
NODE_VERSION="v22.16.0"
BLITZ_NODE_DIR="$CONSOLE_HOME/.blitz/node-runtime"
NODE_DIR=""

if [ -x "$BLITZ_NODE_DIR/bin/node" ]; then
    EXISTING_NODE=$("$BLITZ_NODE_DIR/bin/node" --version 2>/dev/null || echo "")
    if [ "$EXISTING_NODE" = "$NODE_VERSION" ]; then
        echo "OK: Node.js $NODE_VERSION already installed at $BLITZ_NODE_DIR" >> "$LOG"
        NODE_DIR="$BLITZ_NODE_DIR/bin"
    else
        echo "Node.js version mismatch ($EXISTING_NODE vs $NODE_VERSION), reinstalling..." >> "$LOG"
        rm -rf "$BLITZ_NODE_DIR"
    fi
fi

if [ -z "$NODE_DIR" ]; then
    echo "Installing Node.js $NODE_VERSION..." >> "$LOG"
    show_progress "Installing Node.js runtime..."

    ARCH=$(uname -m)
    if [ "$ARCH" = "arm64" ]; then
        NODE_ARCH="arm64"
    else
        NODE_ARCH="x64"
    fi
    NODE_TARBALL="node-${NODE_VERSION}-darwin-${NODE_ARCH}.tar.gz"
    NODE_URL="https://nodejs.org/dist/${NODE_VERSION}/${NODE_TARBALL}"

    NODE_TMP="/tmp/blitz-node-$$"
    rm -rf "$NODE_TMP"
    mkdir -p "$NODE_TMP"

    if curl -fsSL "$NODE_URL" -o "$NODE_TMP/$NODE_TARBALL" 2>> "$LOG"; then
        mkdir -p "$BLITZ_NODE_DIR"
        tar -xzf "$NODE_TMP/$NODE_TARBALL" -C "$BLITZ_NODE_DIR" --strip-components=1 2>> "$LOG"
        if [ "$IS_ROOT" = true ]; then chown -R "$CONSOLE_USER" "$BLITZ_NODE_DIR"; fi
        echo "Node.js $("$BLITZ_NODE_DIR/bin/node" --version 2>/dev/null) installed to $BLITZ_NODE_DIR" >> "$LOG"
        NODE_DIR="$BLITZ_NODE_DIR/bin"
    else
        echo "ERROR: Failed to download Node.js from $NODE_URL" >> "$LOG"
    fi

    rm -rf "$NODE_TMP"
fi

if [ -z "$NODE_DIR" ] || [ ! -x "$NODE_DIR/node" ]; then
    fail "Failed to install Node.js $NODE_VERSION. Check /tmp/blitz_install.log for details."
fi
echo "Node ready at: $NODE_DIR/node ($("$NODE_DIR/node" --version 2>/dev/null))" >> "$LOG"
rm -f "$CONSOLE_HOME/.blitz/node-bin-path" 2>/dev/null || true

echo "TIMING: node install took $(( $(date +%s) - T_NODE_START ))s" >> "$LOG"

# ============================================================================
# Install/update @blitzdev/iphone-mcp in the bundled Node runtime
# ============================================================================

T_IPHONE_MCP_START=$(date +%s)
NPM_BIN="$NODE_DIR/npm"
IPHONE_MCP_BIN="$NODE_DIR/iphone-mcp"

if [ -x "$NPM_BIN" ]; then
    echo "Installing @blitzdev/iphone-mcp..." >> "$LOG"
    if run_as_user \
        env \
            "HOME=$CONSOLE_HOME" \
            "PATH=$NODE_DIR:/usr/bin:/bin:/usr/sbin:/sbin" \
            "npm_config_cache=$CONSOLE_TMPDIR/blitz-npm-cache" \
            "npm_config_loglevel=error" \
            "npm_config_update_notifier=false" \
            "$NPM_BIN" install -g --prefix "$BLITZ_NODE_DIR" @blitzdev/iphone-mcp@latest > /dev/null 2>> "$LOG"; then
        if [ -x "$IPHONE_MCP_BIN" ]; then
            echo "iphone-mcp ready at: $IPHONE_MCP_BIN" >> "$LOG"
        else
            echo "WARNING: iphone-mcp install reported success but binary was not found at $IPHONE_MCP_BIN" >> "$LOG"
        fi
    else
        if [ -x "$IPHONE_MCP_BIN" ]; then
            echo "WARNING: iphone-mcp refresh failed; keeping existing binary at $IPHONE_MCP_BIN" >> "$LOG"
        else
            echo "WARNING: Failed to install @blitzdev/iphone-mcp" >> "$LOG"
        fi
    fi
else
    echo "WARNING: npm not found at $NPM_BIN; skipping iphone-mcp install" >> "$LOG"
fi

echo "TIMING: iphone-mcp install took $(( $(date +%s) - T_IPHONE_MCP_START ))s" >> "$LOG"

if [ ! -d "$APP_DIR" ]; then
    echo "WARNING: Blitz.app not found in /Applications — skipping chown (app may be installed later)." >> "$LOG"
else
    # Make the app owned by the console user (not root) so the auto-updater
    # can replace it without requiring admin privileges.
    if [ "$IS_ROOT" = true ]; then
        chown -R "$CONSOLE_USER" "$APP_DIR" 2>/dev/null || true
        echo "Chowned $APP_DIR to $CONSOLE_USER" >> "$LOG"
    fi
fi

# ============================================================================
# Create user directories
# ============================================================================

T_STEP=$(date +%s)
BLITZ_DIR="$CONSOLE_HOME/.blitz/projects"
if mkdir -p "$BLITZ_DIR" 2>> "$LOG"; then
    if [ "$IS_ROOT" = true ]; then
        chown "$CONSOLE_USER" "$CONSOLE_HOME/.blitz" 2>/dev/null || true
        chown "$CONSOLE_USER" "$BLITZ_DIR" 2>/dev/null || true
    fi
    echo "Created $BLITZ_DIR" >> "$LOG"
else
    echo "WARNING: Failed to create $BLITZ_DIR" >> "$LOG"
fi
echo "TIMING: create user dirs took $(( $(date +%s) - T_STEP ))s" >> "$LOG"

# ============================================================================
# Install Python 3 + idb (Facebook iOS Development Bridge)
# ============================================================================

T_IDB_START=$(date +%s)
if [ "${BLITZ_UPDATE_CONTEXT:-}" = "auto-update" ]; then
    echo "Skipping Python and idb bootstrap during auto-update" >> "$LOG"
    echo "TIMING: python + idb took 0s" >> "$LOG"
else
    BLITZ_PYTHON_DIR="$CONSOLE_HOME/.blitz/python"
    BLITZ_IDB_COMPANION_DIR="$CONSOLE_HOME/.blitz/idb-companion"
    IDB_COMPANION_BIN="$BLITZ_IDB_COMPANION_DIR/bin/idb_companion"
    IDB_CLI_PATH="$BLITZ_PYTHON_DIR/bin/idb"

    if [ -x "$IDB_CLI_PATH" ] && "$IDB_CLI_PATH" --help >/dev/null 2>&1; then
        echo "OK: idb already installed at $IDB_CLI_PATH" >> "$LOG"
    else
        echo "Installing Python 3 + idb..." >> "$LOG"
        show_progress "Installing idb (iOS Development Bridge)..."

        # [1] Download pre-built Python 3
        if [ ! -x "$BLITZ_PYTHON_DIR/bin/python3" ]; then
            echo "Downloading pre-built Python 3..." >> "$LOG"
            ARCH=$(uname -m)
            if [ "$ARCH" = "arm64" ]; then
                PYTHON_URL="https://github.com/indygreg/python-build-standalone/releases/download/20241206/cpython-3.12.8+20241206-aarch64-apple-darwin-install_only.tar.gz"
            else
                PYTHON_URL="https://github.com/indygreg/python-build-standalone/releases/download/20241206/cpython-3.12.8+20241206-x86_64-apple-darwin-install_only.tar.gz"
            fi

            PYTHON_TMP="/tmp/blitz-python-$$"
            rm -rf "$PYTHON_TMP"
            mkdir -p "$PYTHON_TMP"

            if curl -fsSL "$PYTHON_URL" -o "$PYTHON_TMP/python.tar.gz" 2>> "$LOG"; then
                mkdir -p "$BLITZ_PYTHON_DIR"
                tar -xzf "$PYTHON_TMP/python.tar.gz" -C "$BLITZ_PYTHON_DIR" --strip-components=1 2>> "$LOG"
                if [ "$IS_ROOT" = true ]; then chown -R "$CONSOLE_USER" "$BLITZ_PYTHON_DIR"; fi
                echo "Python 3 installed to $BLITZ_PYTHON_DIR ($($BLITZ_PYTHON_DIR/bin/python3 --version 2>/dev/null))" >> "$LOG"
            else
                echo "WARNING: Failed to download Python 3" >> "$LOG"
            fi

            rm -rf "$PYTHON_TMP"
        else
            echo "OK: Python 3 already installed at $BLITZ_PYTHON_DIR/bin/python3" >> "$LOG"
        fi

        # [2] Download pre-built idb-companion
        if [ ! -x "$IDB_COMPANION_BIN" ]; then
            echo "Downloading idb-companion..." >> "$LOG"
            IDB_COMPANION_URL="https://github.com/facebook/idb/releases/download/v1.1.8/idb-companion.universal.tar.gz"

            IDB_TMP="/tmp/blitz-idb-companion-$$"
            rm -rf "$IDB_TMP"
            mkdir -p "$IDB_TMP"

            if curl -fsSL "$IDB_COMPANION_URL" -o "$IDB_TMP/idb-companion.tar.gz" 2>> "$LOG"; then
                mkdir -p "$BLITZ_IDB_COMPANION_DIR"
                tar -xzf "$IDB_TMP/idb-companion.tar.gz" -C "$BLITZ_IDB_COMPANION_DIR" --strip-components=1 2>> "$LOG"
                if [ "$IS_ROOT" = true ]; then chown -R "$CONSOLE_USER" "$BLITZ_IDB_COMPANION_DIR"; fi
                echo "idb-companion installed to $BLITZ_IDB_COMPANION_DIR" >> "$LOG"
            else
                echo "WARNING: Failed to download idb-companion" >> "$LOG"
            fi

            rm -rf "$IDB_TMP"
        else
            echo "OK: idb-companion already installed at $IDB_COMPANION_BIN" >> "$LOG"
        fi

        # [3] pip install fb-idb
        if [ -x "$BLITZ_PYTHON_DIR/bin/pip3" ]; then
            echo "Installing fb-idb via pip..." >> "$LOG"
            if run_as_user \
                "$BLITZ_PYTHON_DIR/bin/pip3" install fb-idb > /dev/null 2>> "$LOG"; then
                echo "fb-idb installed successfully" >> "$LOG"
            else
                echo "WARNING: pip install fb-idb failed" >> "$LOG"
            fi
        else
            echo "WARNING: pip3 not found, cannot install fb-idb" >> "$LOG"
        fi

        if [ -x "$IDB_CLI_PATH" ]; then
            echo "OK: idb CLI ready at $IDB_CLI_PATH" >> "$LOG"
        else
            echo "WARNING: idb CLI not found at $IDB_CLI_PATH after installation" >> "$LOG"
        fi
    fi
    echo "TIMING: python + idb took $(( $(date +%s) - T_IDB_START ))s" >> "$LOG"
fi

# ============================================================================
# Launch Blitz.app
# ============================================================================

echo "Launching Blitz.app..." >> "$LOG"
# Quit any running Blitz app so `open` launches the new one.
# The old Tauri app's executable is "app" (not "Blitz"), so killall won't work.
# osascript quit-by-bundle-ID works for both old Tauri and new native app.
run_as_user osascript -e 'tell application id "dev.blitz.mac" to quit' 2>/dev/null || true
run_as_user osascript -e 'tell application id "dev1.blitz.mac" to quit' 2>/dev/null || true
run_as_user osascript -e 'tell application id "com.blitz.macos" to quit' 2>/dev/null || true
sleep 1
run_as_user open /Applications/Blitz.app 2>> "$LOG" \
    && echo "Blitz.app launched" >> "$LOG" \
    || echo "WARNING: Failed to launch Blitz.app" >> "$LOG"

echo "TIMING: postinstall total took $(( $(date +%s) - T_POSTINSTALL_START ))s" >> "$LOG"
echo "=== Postinstall completed ===" >> "$LOG"
exit 0
