#!/usr/bin/env bash
set -euo pipefail

# Parse arguments
AUTO_CONFIRM=false
while [[ $# -gt 0 ]]; do
  case $1 in
    -y|--yes|--no-interactive)
      AUTO_CONFIRM=true
      shift
      ;;
    *)
      shift
      ;;
  esac
done

# Helper for confirmation prompts
confirm() {
    local prompt="$1"
    
    if [ "$AUTO_CONFIRM" = true ] || [ ! -t 0 ]; then
        return 0 # Default to yes in non-interactive/auto-confirm mode
    fi
    
    while true; do
        read -p "$prompt [Y/n]: " response
        case "$response" in
            [yY][eE][sS]|[yY]|"")
                return 0
                ;;
            [nN][oO]|[nN])
                return 1
                ;;
            *)
                echo "Please answer yes (y) or no (n)."
                ;;
        esac
    done
}

# Configurations
BASE_URL="https://rentsync-cf-tunnels.pages.dev/bin"
APP_DIR="$HOME/.config/rentsync-cf-tunnels"
BIN_DIR="$APP_DIR/bin"
DAEMON_DEST="$APP_DIR/rentsync-cf-tunnels-daemon"
UI_DEST="$APP_DIR/rentsync-cf-tunnels-ui"
SERVICE_DEST="$HOME/.config/systemd/user/rentsync-cf-tunnels.service"
DESKTOP_ENTRY="$HOME/.local/share/applications/rentsync-cf-tunnels.desktop"

echo "=== Rentsync Cloudflare Tunnel Manager Installer ==="

# Check for download tools
download_file() {
    if command -v curl &>/dev/null; then
        curl -sSfL "$1" -o "$2"
    elif command -v wget &>/dev/null; then
        wget -qO "$2" "$1"
    else
        echo "Error: Neither curl nor wget was found on the system. Please install one to run this script."
        exit 1
    fi
}

# Determine mode: Local source mode or Download-based standalone mode
IS_LOCAL=false
if [ -d "src" ] && [ -d "daemon" ] && [ -f "rentsync-cf-tunnels.service" ]; then
    IS_LOCAL=true
fi

# Create directories
echo "Creating application directories..."
mkdir -p "$APP_DIR" "$BIN_DIR" "$APP_DIR/ui"

# 1. Install Web UI static files
if [ "$IS_LOCAL" = true ]; then
    echo "Installing Web UI static files from local source..."
    cp -r src/* "$APP_DIR/ui/"
else
    echo "Downloading and extracting Web UI..."
    download_file "$BASE_URL/ui.tar.gz" "/tmp/rentsync-ui.tar.gz"
    tar -xzf "/tmp/rentsync-ui.tar.gz" -C "$APP_DIR/ui"
    rm -f "/tmp/rentsync-ui.tar.gz"
fi

# 2. Clean up host cloudflared binary to prevent host pollution
if [ -f "$BIN_DIR/cloudflared" ]; then
    echo "Cleaning up host cloudflared binary to prevent host pollution..."
    rm -f "$BIN_DIR/cloudflared"
fi
echo "Using containerized cloudflared (managed via Docker/Podman)."

# 3. Install background daemon
if [ "$IS_LOCAL" = true ]; then
    # Try using pre-compiled daemon first to save time
    if [ -f "src-tauri/target/release/rentsync-cf-tunnels-daemon" ]; then
        echo "Installing pre-built local background daemon..."
        cp "src-tauri/target/release/rentsync-cf-tunnels-daemon" "$DAEMON_DEST"
    else
        echo "Compiling background daemon from local source..."
        if command -v go &>/dev/null; then
            GO_BIN="go"
        elif [ -f "$HOME/.local/go/bin/go" ]; then
            GO_BIN="$HOME/.local/go/bin/go"
        else
            echo "Error: Go compiler not found! Please install Go to build the daemon."
            exit 1
        fi
        cd daemon
        $GO_BIN build -o "$DAEMON_DEST" main.go
        cd ..
    fi
else
    echo "Downloading precompiled background daemon..."
    download_file "$BASE_URL/rentsync-cf-tunnels-daemon" "$DAEMON_DEST"
fi
chmod +x "$DAEMON_DEST"

# 4. Install systemd service
echo "Installing systemd user service..."
mkdir -p "$HOME/.config/systemd/user"
if [ "$IS_LOCAL" = true ]; then
    cp rentsync-cf-tunnels.service "$SERVICE_DEST"
else
    download_file "$BASE_URL/rentsync-cf-tunnels.service" "$SERVICE_DEST"
fi

# Reload daemon configuration
systemctl --user daemon-reload

if confirm "Do you want to enable the Tunnel Manager to run automatically at system startup?"; then
    systemctl --user enable rentsync-cf-tunnels
    echo "Startup auto-run enabled!"
else
    systemctl --user disable rentsync-cf-tunnels || true
    echo "Startup auto-run disabled."
fi

if confirm "Do you want to start the tunnels daemon immediately?"; then
    systemctl --user restart rentsync-cf-tunnels
    echo "Tunnels daemon started successfully!"
else
    systemctl --user stop rentsync-cf-tunnels || true
    echo "Tunnels daemon stopped/not running."
fi

# 5. Install Tauri UI binary
if [ "$IS_LOCAL" = true ]; then
    # Try using pre-compiled UI binary first to save time
    if [ -f "src-tauri/target/release/rentsync-cloudflare-tunnel-manager" ]; then
        echo "Installing pre-built local desktop application..."
        cp "src-tauri/target/release/rentsync-cloudflare-tunnel-manager" "$UI_DEST"
        cp src-tauri/icons/128x128.png "$APP_DIR/icon.png"
    else
        echo "Compiling Tauri desktop UI from local source..."
        if command -v npm &>/dev/null && command -v cargo &>/dev/null; then
            npm install
            CARGO_TARGET_DIR="$PWD/src-tauri/target_dev" npm run tauri build
            cp "src-tauri/target_dev/release/rentsync-cloudflare-tunnel-manager" "$UI_DEST"
            cp src-tauri/icons/128x128.png "$APP_DIR/icon.png"
        else
            echo "Warning: npm or cargo is missing. Skipping Tauri UI compilation."
            echo "You can download precompiled binaries or install Node and Rust to build manually."
        fi
    fi
else
    echo "Downloading precompiled desktop application..."
    download_file "$BASE_URL/rentsync-cf-tunnels-ui" "$UI_DEST"
    download_file "$BASE_URL/icon.png" "$APP_DIR/icon.png"
fi

# 6. Create desktop launcher entry
if [ -f "$UI_DEST" ]; then
    chmod +x "$UI_DEST"
    echo "Creating desktop launcher entry..."
    mkdir -p "$HOME/.local/share/applications"
    cat <<EOF > "$DESKTOP_ENTRY"
[Desktop Entry]
Name=Rentsync Cloudflare Tunnel Manager
Comment=Rentsync Cloudflare TCP Tunnels
Exec=$UI_DEST
Icon=$APP_DIR/icon.png
Terminal=false
Type=Application
Categories=Utility;Development;
EOF
    chmod +x "$DESKTOP_ENTRY"
    echo "Desktop entry created at $DESKTOP_ENTRY"
    
    # Update desktop database cache
    if command -v update-desktop-database &>/dev/null; then
        update-desktop-database "$HOME/.local/share/applications" || true
    fi
fi

echo "=== Installation Completed Successfully! ==="
