#!/bin/bash
# Install script for micro CLI
# Usage: curl -fsSL https://go-micro.dev/install.sh | sh

set -e

VERSION="${MICRO_VERSION:-latest}"
OS=$(uname -s | tr '[:upper:]' '[:lower:]')
ARCH=$(uname -m)

# Normalize architecture
case $ARCH in
    x86_64|amd64) ARCH="amd64" ;;
    aarch64|arm64) ARCH="arm64" ;;
    armv7l) ARCH="armv7" ;;
    *) echo "Unsupported architecture: $ARCH"; exit 1 ;;
esac

# Normalize OS
case $OS in
    darwin) OS="darwin" ;;
    linux) OS="linux" ;;
    *) echo "Unsupported OS: $OS"; exit 1 ;;
esac

# Determine install directory. MICRO_INSTALL_DIR is intended for CI/local smoke
# tests that verify the installer without writing to a real system directory.
if [ -n "${MICRO_INSTALL_DIR:-}" ]; then
    INSTALL_DIR="$MICRO_INSTALL_DIR"
    mkdir -p "$INSTALL_DIR"
elif [ "$EUID" -eq 0 ] || [ "$(id -u)" -eq 0 ]; then
    INSTALL_DIR="/usr/local/bin"
else
    INSTALL_DIR="$HOME/.local/bin"
    mkdir -p "$INSTALL_DIR"
fi

echo "Installing micro ${VERSION} for ${OS}/${ARCH}..."

# Download URL
if [ "$VERSION" = "latest" ]; then
    URL="https://github.com/micro/go-micro/releases/latest/download/micro_${OS}_${ARCH}.tar.gz"
else
    URL="https://github.com/micro/go-micro/releases/download/${VERSION}/micro_${OS}_${ARCH}.tar.gz"
fi

# Create temp directory for extraction
TMP_DIR=$(mktemp -d)
TMP_FILE="${TMP_DIR}/micro.tar.gz"

# Download, or use a local release archive supplied by the deterministic smoke
# harness. The default path still fetches the documented GitHub release artifact.
if [ -n "${MICRO_INSTALL_ARCHIVE:-}" ]; then
    cp "$MICRO_INSTALL_ARCHIVE" "$TMP_FILE"
elif command -v curl &> /dev/null; then
    curl -fsSL "$URL" -o "$TMP_FILE"
elif command -v wget &> /dev/null; then
    wget -q "$URL" -O "$TMP_FILE"
else
    echo "Error: curl or wget required"
    rm -rf "$TMP_DIR"
    exit 1
fi

# Extract and install
tar -xzf "$TMP_FILE" -C "$TMP_DIR"

# Handle different archive structures (binary at root or in subdirectory)
if [ -f "${TMP_DIR}/micro" ]; then
    BINARY_PATH="${TMP_DIR}/micro"
elif [ -f "${TMP_DIR}/micro_${OS}_${ARCH}/micro" ]; then
    BINARY_PATH="${TMP_DIR}/micro_${OS}_${ARCH}/micro"
else
    # Try to find any executable named 'micro' in the extracted content
    BINARY_PATH=$(find "$TMP_DIR" -name "micro" -type f -executable | head -n1)
fi

if [ -z "$BINARY_PATH" ] || [ ! -f "$BINARY_PATH" ]; then
    echo "Error: Could not find micro binary in archive"
    echo "Archive contents:"
    tar -tzf "$TMP_FILE"
    rm -rf "$TMP_DIR"
    exit 1
fi

chmod +x "$BINARY_PATH"
mv "$BINARY_PATH" "$INSTALL_DIR/micro"

# Cleanup
rm -rf "$TMP_DIR"

echo ""
echo "✓ Installed micro to $INSTALL_DIR/micro"
echo ""

# Verify
if command -v micro &> /dev/null; then
    micro --version
else
    echo "Note: Add $INSTALL_DIR to your PATH:"
    echo "  export PATH=\"\$PATH:$INSTALL_DIR\""
fi

echo ""
echo "Get started:"
echo "  micro new myservice    # Create a new service"
echo "  micro run              # Run locally"
echo "  micro deploy           # Deploy to server"
echo ""
