#!/usr/bin/env bash
set -e

# SiliconPin CLI (sp) Unix Installer
# Supported OS: Linux, macOS
# Shell Support: Fish, Zsh, Bash

CLI_NAME="sp"
INSTALL_DIR="/usr/local/bin"
ALT_INSTALL_DIR="$HOME/.sp/bin"

# Detect OS and Architecture
OS="$(uname -s 2>/dev/null | tr '[:upper:]' '[:lower:]')"
ARCH="$(uname -m 2>/dev/null)"

case "$OS" in
    linux)
        case "$ARCH" in
            x86_64|amd64) BIN_NAME="sp" ;;
            aarch64|arm64) BIN_NAME="sp-linux-arm64" ;;
            *) BIN_NAME="sp" ;;
        esac
        ;;
    darwin)
        case "$ARCH" in
            x86_64|amd64) BIN_NAME="sp-darwin-amd64" ;;
            arm64|aarch64) BIN_NAME="sp-darwin-arm64" ;;
            *) BIN_NAME="sp-darwin-arm64" ;;
        esac
        ;;
    *)
        BIN_NAME="sp"
        ;;
esac

DOWNLOAD_URL="https://siliconpin.com/downloads/sp/$BIN_NAME"

echo "=========================================="
echo "🚀 Installing SiliconPin CLI ($CLI_NAME)"
echo "=========================================="

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd || echo "")"

if [ -n "$SCRIPT_DIR" ] && [ -f "$SCRIPT_DIR/main.go" ] && command -v go >/dev/null 2>&1; then
    echo "Compiling $CLI_NAME from source..."
    (cd "$SCRIPT_DIR" && go build -o "$CLI_NAME" main.go)
    BINARY_PATH="$SCRIPT_DIR/$CLI_NAME"
elif [ -n "$SCRIPT_DIR" ] && [ -f "$SCRIPT_DIR/$BIN_NAME" ]; then
    BINARY_PATH="$SCRIPT_DIR/$BIN_NAME"
elif [ -n "$SCRIPT_DIR" ] && [ -f "$SCRIPT_DIR/$CLI_NAME" ]; then
    BINARY_PATH="$SCRIPT_DIR/$CLI_NAME"
else
    echo "Downloading $CLI_NAME binary ($OS/$ARCH) from $DOWNLOAD_URL..."
    TMP_DIR="$(mktemp -d)"
    curl -fsSL "$DOWNLOAD_URL" -o "$TMP_DIR/$CLI_NAME"
    chmod +x "$TMP_DIR/$CLI_NAME"
    BINARY_PATH="$TMP_DIR/$CLI_NAME"
fi

# Install binary
if [ -w "$INSTALL_DIR" ]; then
    cp "$BINARY_PATH" "$INSTALL_DIR/$CLI_NAME"
    chmod +x "$INSTALL_DIR/$CLI_NAME"
    TARGET_PATH="$INSTALL_DIR/$CLI_NAME"
else
    echo "Installing to user bin directory ($ALT_INSTALL_DIR)..."
    mkdir -p "$ALT_INSTALL_DIR"
    cp "$BINARY_PATH" "$ALT_INSTALL_DIR/$CLI_NAME"
    chmod +x "$ALT_INSTALL_DIR/$CLI_NAME"
    TARGET_PATH="$ALT_INSTALL_DIR/$CLI_NAME"
    
    USER_SHELL="${SHELL:-}"
    
    if [[ ":$PATH:" != *":$ALT_INSTALL_DIR:"* ]]; then
        echo ""
        echo "⚙️  Configuring PATH for your shell environment..."
        
        # Fish Shell
        if [[ "$USER_SHELL" == *"fish"* ]] || [ -d "$HOME/.config/fish" ] || command -v fish >/dev/null 2>&1; then
            if command -v fish >/dev/null 2>&1; then
                fish -c "fish_add_path -g '$ALT_INSTALL_DIR'" 2>/dev/null || true
            fi
            FISH_CONF="$HOME/.config/fish/config.fish"
            mkdir -p "$HOME/.config/fish"
            if [ ! -f "$FISH_CONF" ] || ! grep -q "fish_add_path.*\.sp/bin" "$FISH_CONF" 2>/dev/null; then
                echo "" >> "$FISH_CONF"
                echo "# SiliconPin CLI PATH" >> "$FISH_CONF"
                echo "fish_add_path \$HOME/.sp/bin" >> "$FISH_CONF"
            fi
            echo "   [Fish] Added '$ALT_INSTALL_DIR' to $FISH_CONF"
        fi

        # Zsh Shell
        if [[ "$USER_SHELL" == *"zsh"* ]] || [ -f "$HOME/.zshrc" ]; then
            ZSH_CONF="$HOME/.zshrc"
            if [ ! -f "$ZSH_CONF" ] || ! grep -q "\.sp/bin" "$ZSH_CONF" 2>/dev/null; then
                echo "" >> "$ZSH_CONF"
                echo "# SiliconPin CLI PATH" >> "$ZSH_CONF"
                echo 'export PATH="$HOME/.sp/bin:$PATH"' >> "$ZSH_CONF"
            fi
            echo "   [Zsh] Added '$ALT_INSTALL_DIR' to $ZSH_CONF"
        fi

        # Bash Shell
        if [[ "$USER_SHELL" == *"bash"* ]] || [ -f "$HOME/.bashrc" ] || [ -f "$HOME/.bash_profile" ]; then
            BASH_CONF="$HOME/.bashrc"
            [ -f "$HOME/.bash_profile" ] && [ ! -f "$HOME/.bashrc" ] && BASH_CONF="$HOME/.bash_profile"
            if [ ! -f "$BASH_CONF" ] || ! grep -q "\.sp/bin" "$BASH_CONF" 2>/dev/null; then
                echo "" >> "$BASH_CONF"
                echo "# SiliconPin CLI PATH" >> "$BASH_CONF"
                echo 'export PATH="$HOME/.sp/bin:$PATH"' >> "$BASH_CONF"
            fi
            echo "   [Bash] Added '$ALT_INSTALL_DIR' to $BASH_CONF"
        fi
    fi
fi

# Shell Autocompletions Installation
USER_SHELL="${SHELL:-}"
echo ""
echo "⚙️  Installing shell autocompletions..."

# Fish Completions
if [ -d "$HOME/.config/fish" ] || [[ "$USER_SHELL" == *"fish"* ]] || command -v fish >/dev/null 2>&1; then
    mkdir -p "$HOME/.config/fish/completions"
    "$TARGET_PATH" completion fish > "$HOME/.config/fish/completions/sp.fish" 2>/dev/null || true
    echo "   [Fish] Autocompletions installed at ~/.config/fish/completions/sp.fish"
fi

# Zsh Completions
if [ -f "$HOME/.zshrc" ] || [[ "$USER_SHELL" == *"zsh"* ]]; then
    mkdir -p "$HOME/.zsh/completions"
    "$TARGET_PATH" completion zsh > "$HOME/.zsh/completions/_sp" 2>/dev/null || true
    echo "   [Zsh] Autocompletions installed at ~/.zsh/completions/_sp"
fi

# Bash Completions
if [ -f "$HOME/.bashrc" ] || [[ "$USER_SHELL" == *"bash"* ]]; then
    BASH_COMP_DIR="$HOME/.local/share/bash-completion/completions"
    mkdir -p "$BASH_COMP_DIR"
    "$TARGET_PATH" completion bash > "$BASH_COMP_DIR/sp" 2>/dev/null || true
    echo "   [Bash] Autocompletions installed at ~/.local/share/bash-completion/completions/sp"
fi

echo "------------------------------------------"
echo "✅ $CLI_NAME CLI installed successfully at $TARGET_PATH"
echo ""
echo "To reload your shell environment:"
echo "   Fish:  fish_add_path ~/.sp/bin"
echo "   Zsh:   source ~/.zshrc"
echo "   Bash:  source ~/.bashrc"
echo ""
echo "Run '$CLI_NAME --help' to get started!"
echo "=========================================="
