#!/usr/bin/env sh
# Tangu POSIX Shell Installer
# Usage: curl -fsSL https://tangu.dev/install.sh | sh

set -e

# Configuration & Defaults
TANGU_SERVER_URL="${TANGU_SERVER_URL:-https://tangu.dev}"
TANGU_INSTALL_DIR="${TANGU_INSTALL_DIR:-$HOME/.tangu}"

if [ -t 1 ] && [ -z "${NO_COLOR:-}" ]; then
    BOLD="$(printf '\033[1m')"
    GREEN="$(printf '\033[0;32m')"
    BLUE="$(printf '\033[0;34m')"
    YELLOW="$(printf '\033[0;33m')"
    RESET="$(printf '\033[0m')"
else
    BOLD=""
    GREEN=""
    BLUE=""
    YELLOW=""
    RESET=""
fi

echo "${BOLD}${BLUE}=== Installing Tangu Language & Toolchain ===${RESET}"

# 1. Detect OS & Architecture
OS_TYPE="$(uname -s)"
ARCH_TYPE="$(uname -m)"

case "$OS_TYPE" in
    Linux)
        OS="unknown-linux-gnu"
        ;;
    Darwin)
        OS="apple-darwin"
        ;;
    *)
        echo "Error: Unsupported operating system '$OS_TYPE'. Tangu currently supports Linux and macOS."
        exit 1
        ;;
esac

case "$ARCH_TYPE" in
    x86_64|amd64)
        ARCH="x86_64"
        ;;
    aarch64|arm64)
        ARCH="aarch64"
        ;;
    *)
        echo "Error: Unsupported CPU architecture '$ARCH_TYPE'."
        exit 1
        ;;
esac

TARGET_TRIPLE="${ARCH}-${OS}"
echo "Detected Platform: ${TARGET_TRIPLE}"

# 2. Determine Download URL / Release Archive
if [ -n "$TANGU_VERSION" ]; then
    VERSION="$TANGU_VERSION"
    TARBALL_NAME="tangu-v${VERSION}-${TARGET_TRIPLE}.tar.gz"
else
    # Fetch latest version metadata if available
    JSON_URL="${TANGU_SERVER_URL}/latest.json"
    if command -v curl >/dev/null 2>&1; then
        LATEST_JSON="$(curl --retry 3 --retry-connrefused -fsSL "$JSON_URL" 2>/dev/null || true)"
    elif command -v wget >/dev/null 2>&1; then
        LATEST_JSON="$(wget -qO- "$JSON_URL" 2>/dev/null || true)"
    fi

    if [ -n "$LATEST_JSON" ]; then
        VERSION="$(echo "$LATEST_JSON" | grep -o '"version": "[^"]*"' | cut -d'"' -f4 || true)"
        TARBALL_NAME="$(echo "$LATEST_JSON" | grep -o '"archive": "[^"]*"' | cut -d'"' -f4 || true)"
    fi

    if [ -z "$VERSION" ] || [ -z "$TARBALL_NAME" ]; then
        VERSION="0.32.0"
        TARBALL_NAME="tangu-v${VERSION}-${TARGET_TRIPLE}.tar.gz"
    fi
fi

DOWNLOAD_URL="${TANGU_SERVER_URL}/${TARBALL_NAME}"

# 3. Create Temporary Directory & Download
TMP_DIR="$(mktemp -d 2>/dev/null || mktemp -d -t 'tangu_install')"
trap 'rm -rf "$TMP_DIR"' EXIT

if [ -n "$TANGU_LOCAL_TARBALL" ] && [ -f "$TANGU_LOCAL_TARBALL" ]; then
    echo "Using local release package $TANGU_LOCAL_TARBALL..."
    cp "$TANGU_LOCAL_TARBALL" "$TMP_DIR/$TARBALL_NAME"
elif [ -f "./dist/$TARBALL_NAME" ]; then
    echo "Using local release package ./dist/$TARBALL_NAME..."
    cp "./dist/$TARBALL_NAME" "$TMP_DIR/$TARBALL_NAME"
elif [ -f "./tangu-site/$TARBALL_NAME" ]; then
    echo "Using local release package ./tangu-site/$TARBALL_NAME..."
    cp "./tangu-site/$TARBALL_NAME" "$TMP_DIR/$TARBALL_NAME"
else
    echo "Downloading Tangu v${VERSION} from ${DOWNLOAD_URL}..."
    if command -v curl >/dev/null 2>&1; then
        curl --retry 3 --retry-connrefused -fsSL "$DOWNLOAD_URL" -o "$TMP_DIR/$TARBALL_NAME"
    elif command -v wget >/dev/null 2>&1; then
        wget -qO "$TMP_DIR/$TARBALL_NAME" "$DOWNLOAD_URL"
    else
        echo "Error: Neither 'curl' nor 'wget' is installed."
        exit 1
    fi
fi


# 4. Extract into Installation Directory
echo "Installing to ${TANGU_INSTALL_DIR}..."
mkdir -p "$TANGU_INSTALL_DIR"

tar -xzf "$TMP_DIR/$TARBALL_NAME" -C "$TMP_DIR"
EXTRACTED_DIR="$(find "$TMP_DIR" -maxdepth 1 -type d -name "tangu-*" | head -n 1)"

if [ -z "$EXTRACTED_DIR" ]; then
    echo "Error: Failed to unpack release archive."
    exit 1
fi

rm -rf "$TANGU_INSTALL_DIR/bin" "$TANGU_INSTALL_DIR/root"
cp -R "$EXTRACTED_DIR/bin" "$TANGU_INSTALL_DIR/"
cp -R "$EXTRACTED_DIR/root" "$TANGU_INSTALL_DIR/"

# 5. Fix macOS Quarantine Attributes
if [ "$OS_TYPE" = "Darwin" ]; then
    if command -v xattr >/dev/null 2>&1; then
        xattr -dr com.apple.quarantine "$TANGU_INSTALL_DIR" 2>/dev/null || true
    fi
fi

# 6. Configure Shell Environment PATH & TANGU_ROOT
BIN_DIR="$TANGU_INSTALL_DIR/bin"
ROOT_DIR="$TANGU_INSTALL_DIR/root"

PATH_LINE="export PATH=\"$BIN_DIR:\$PATH\""
ROOT_LINE="export TANGU_ROOT=\"$ROOT_DIR\""

add_to_file() {
    FILE="$1"
    if [ -f "$FILE" ]; then
        if ! grep -q "TANGU_ROOT" "$FILE"; then
            echo "" >> "$FILE"
            echo "# Tangu Environment Setup" >> "$FILE"
            echo "$PATH_LINE" >> "$FILE"
            echo "$ROOT_LINE" >> "$FILE"
            echo "Added Tangu environment configuration to $FILE"
        fi
    fi
}

add_to_file "$HOME/.bashrc"
add_to_file "$HOME/.zshrc"
add_to_file "$HOME/.profile"

# Fish Shell setup
FISH_CONFIG="$HOME/.config/fish/config.fish"
if [ -d "$HOME/.config/fish" ]; then
    mkdir -p "$HOME/.config/fish"
    if ! grep -q "TANGU_ROOT" "$FISH_CONFIG" 2>/dev/null; then
        echo "" >> "$FISH_CONFIG"
        echo "# Tangu Environment Setup" >> "$FISH_CONFIG"
        echo "set -gx PATH \"$BIN_DIR\" \$PATH" >> "$FISH_CONFIG"
        echo "set -gx TANGU_ROOT \"$ROOT_DIR\"" >> "$FISH_CONFIG"
        echo "Added Tangu environment configuration to $FISH_CONFIG"
    fi
fi

# 7. Execute Health Check (tangu doctor)
printf "\nRunning Tangu Health Diagnostics...\n"
export PATH="$BIN_DIR:$PATH"
export TANGU_ROOT="$ROOT_DIR"

if [ -x "$BIN_DIR/tangu" ]; then
    "$BIN_DIR/tangu" doctor || true
fi

printf "\n%s%s✨ Tangu installation complete!%s\n" "$BOLD" "$GREEN" "$RESET"
echo "Restart your terminal or run:"
echo "  ${BOLD}export PATH=\"$BIN_DIR:\$PATH\"${RESET}"
echo "  ${BOLD}export TANGU_ROOT=\"$ROOT_DIR\"${RESET}"
printf "\nQuickstart Commands:\n"
echo "  tangu repl         # Launch interactive REPL"
echo "  tangu run app.tan  # Run a Tangu program"
echo "  tangu test         # Run tests"
echo "  tangu format       # Format Tangu source files"
echo "  tangu doctor       # Run health check"
