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

# Upesi CLI Installer
# Usage: curl -sSf https://upesi.dev/install.sh | bash

CYAN='\033[0;36m'
GREEN='\033[0;32m'
RED='\033[0;31m'
NC='\033[0m'

info() { echo -e "${CYAN}==>${NC} $1"; }
success() { echo -e "${GREEN}✓${NC} $1"; }
error() { echo -e "${RED}✗${NC} $1"; exit 1; }

# Detect OS
OS="$(uname -s)"
ARCH="$(uname -m)"

info "Upesi CLI Installer"
echo "OS: $OS"
echo "Architecture: $ARCH"

# Check dependencies
command -v ruby >/dev/null 2>&1 || error "Ruby is required but not installed. Please install Ruby 2.7 or later."
command -v curl >/dev/null 2>&1 || error "curl is required but not installed."

# Determine installation directory
if [ -n "$UPESI_INSTALL_DIR" ]; then
  INSTALL_DIR="$UPESI_INSTALL_DIR"
elif [ -d "$HOME/.local/bin" ]; then
  INSTALL_DIR="$HOME/.local/bin"
elif [ -d "/usr/local/bin" ] && [ -w "/usr/local/bin" ]; then
  INSTALL_DIR="/usr/local/bin"
else
  # Create ~/.local/bin if it doesn't exist
  INSTALL_DIR="$HOME/.local/bin"
  mkdir -p "$INSTALL_DIR"
fi

info "Installing to: $INSTALL_DIR"

# API URL (production or development)
if [ -z "$UPESI_API_URL" ]; then
  API_URL="https://api.upesi.dev"
else
  API_URL="$UPESI_API_URL"
fi

# Get latest release info
info "Fetching latest version..."
RELEASE_INFO=$(curl -sf "$API_URL/api/v1/cli/releases/latest" || error "Failed to fetch release info")

VERSION=$(echo "$RELEASE_INFO" | ruby -rjson -e 'puts JSON.parse(STDIN.read)["version"]')
DOWNLOAD_URL=$(echo "$RELEASE_INFO" | ruby -rjson -e 'puts JSON.parse(STDIN.read)["url"]')
SHA256=$(echo "$RELEASE_INFO" | ruby -rjson -e 'puts JSON.parse(STDIN.read)["sha256"]')

info "Latest version: $VERSION"

# Download CLI
TEMP_FILE="/tmp/upesi-$$"
info "Downloading Upesi CLI..."
curl -sf -L -o "$TEMP_FILE" "$DOWNLOAD_URL" || error "Failed to download CLI"

# Verify checksum (if not in development mode)
if [ "$SHA256" != "development-no-checksum" ]; then
  info "Verifying checksum..."
  
  if command -v sha256sum >/dev/null 2>&1; then
    ACTUAL_SHA=$(sha256sum "$TEMP_FILE" | awk '{print $1}')
  elif command -v shasum >/dev/null 2>&1; then
    ACTUAL_SHA=$(shasum -a 256 "$TEMP_FILE" | awk '{print $1}')
  else
    echo "Warning: Cannot verify checksum (no sha256sum or shasum found)"
    ACTUAL_SHA="$SHA256"  # Skip verification
  fi
  
  if [ "$ACTUAL_SHA" != "$SHA256" ]; then
    rm -f "$TEMP_FILE"
    error "Checksum verification failed!"
  fi
  success "Checksum verified"
fi

# Install
info "Installing upesi..."
mv "$TEMP_FILE" "$INSTALL_DIR/upesi"
chmod +x "$INSTALL_DIR/upesi"
success "Installed to $INSTALL_DIR/upesi"

# Check if directory is in PATH and auto-add if not
if echo "$PATH" | grep -q "$INSTALL_DIR"; then
  success "$INSTALL_DIR is already in PATH"
else
  SHELL_NAME=$(basename "${SHELL:-/bin/bash}")
  PATH_LINE="export PATH=\"$INSTALL_DIR:\$PATH\""

  case "$SHELL_NAME" in
    bash)
      RC_FILE="$HOME/.bashrc"
      if [ -f "$RC_FILE" ] && grep -q "$INSTALL_DIR" "$RC_FILE" 2>/dev/null; then
        info "$INSTALL_DIR already in $RC_FILE"
      else
        echo "" >> "$RC_FILE"
        echo "# Added by Upesi installer" >> "$RC_FILE"
        echo "$PATH_LINE" >> "$RC_FILE"
        success "Added $INSTALL_DIR to $RC_FILE"
      fi
      export PATH="$INSTALL_DIR:$PATH"
      ;;
    zsh)
      RC_FILE="$HOME/.zshrc"
      if [ -f "$RC_FILE" ] && grep -q "$INSTALL_DIR" "$RC_FILE" 2>/dev/null; then
        info "$INSTALL_DIR already in $RC_FILE"
      else
        echo "" >> "$RC_FILE"
        echo "# Added by Upesi installer" >> "$RC_FILE"
        echo "$PATH_LINE" >> "$RC_FILE"
        success "Added $INSTALL_DIR to $RC_FILE"
      fi
      export PATH="$INSTALL_DIR:$PATH"
      ;;
    fish)
      if command -v fish >/dev/null 2>&1; then
        fish -c "fish_add_path $INSTALL_DIR" 2>/dev/null
        success "Added $INSTALL_DIR to fish PATH"
      fi
      export PATH="$INSTALL_DIR:$PATH"
      ;;
    *)
      echo ""
      echo "Add $INSTALL_DIR to your PATH manually:"
      echo "  $PATH_LINE"
      echo ""
      export PATH="$INSTALL_DIR:$PATH"
      ;;
  esac
fi

# Test installation
if "$INSTALL_DIR/upesi" version >/dev/null 2>&1; then
  success "Installation successful!"
  echo ""
  echo "Upesi CLI v$VERSION installed successfully!"
  echo ""
  echo "Get started with:"
  echo "  upesi help"
  echo "  upesi login"
  echo "  upesi create my-app"
else
  error "Installation failed - CLI not working"
fi