#!/bin/bash
set -euo pipefail

# Change to temp directory
cd /tmp

# Request sudo access upfront
sudo -v

# Keep sudo alive in background
while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/null &

echo "Stopping and removing MyZenV2 and zs services for all users..."

# Function to safely unload and remove plist files
unload_and_remove() {
    local plist_path="$1"
    local use_sudo="$2"
    local username="$3"
    
    if [ -f "$plist_path" ]; then
        echo "Processing:  $plist_path"
        
        # Unload the service
        if [ "$use_sudo" = "true" ]; then
            sudo launchctl unload "$plist_path" 2>/dev/null || true
        elif [ -n "$username" ]; then
            # Run launchctl as the specific user
            sudo -u "$username" launchctl unload "$plist_path" 2>/dev/null || true
        else
            launchctl unload "$plist_path" 2>/dev/null || true
        fi
        
        # Remove the file
        sudo rm -f "$plist_path"
        echo "  Removed: $plist_path"
    fi
}

# Get list of all users with home directories (excluding system users)
get_real_users() {
    local users=()
    
    # On macOS, get users with UID >= 500 (excluding system users)
    if command -v dscl &> /dev/null; then
        # macOS method
        while IFS= read -r user; do
            uid=$(dscl .  -read "/Users/$user" UniqueID 2>/dev/null | awk '{print $2}')
            if [ -n "$uid" ] && [ "$uid" -ge 500 ] && [ "$uid" -lt 65534 ]; then
                user_home=$(dscl . -read "/Users/$user" NFSHomeDirectory 2>/dev/null | awk '{print $2}')
                if [ -n "$user_home" ] && [ -d "$user_home" ]; then
                    users+=("$user: $user_home")
                fi
            fi
        done < <(dscl . -list /Users 2>/dev/null)
    else
        # Fallback for other systems
        while IFS=: read -r username _ uid _ _ home _; do
            if [ "$uid" -ge 500 ] && [ "$uid" -lt 65534 ] && [ -d "$home" ]; then
                users+=("$username:$home")
            fi
        done < /etc/passwd
    fi
    
    printf '%s\n' "${users[@]}"
}

# Process system-wide LaunchAgents
echo ""
echo "=== Cleaning system-wide LaunchAgents ==="
for plist in /Library/LaunchAgents/*ai.zs.zs*.plist \
             /Library/LaunchAgents/*ai.we360.MyZenV2*.plist \
             /Library/LaunchAgents/launcher.ai.zs.*.plist \
             /Library/LaunchAgents/launcher.ai.we360.*.plist; do
    if [ -e "$plist" ]; then
        # Try unloading as current user first, then with sudo
        unload_and_remove "$plist" "false" ""
        [ -f "$plist" ] && unload_and_remove "$plist" "true" ""
    fi
done

# Process system-wide LaunchDaemons
echo ""
echo "=== Cleaning system-wide LaunchDaemons ==="
for plist in /Library/LaunchDaemons/*ai.zs.zs*.plist \
             /Library/LaunchDaemons/*ai.we360.MyZenV2*.plist \
             /Library/LaunchDaemons/launcher.ai.zs.*.plist \
             /Library/LaunchDaemons/launcher.ai.we360.*.plist; do
    if [ -e "$plist" ]; then
        unload_and_remove "$plist" "true" ""
    fi
done

# Process each user's home directory
echo ""
echo "=== Processing individual user directories ==="

while IFS=: read -r username user_home; do
    if [ -z "$username" ] || [ -z "$user_home" ]; then
        continue
    fi
    
    echo ""
    echo "Processing user: $username ($user_home)"
    
    # Process user LaunchAgents
    if [ -d "$user_home/Library/LaunchAgents" ]; then
        echo "  Checking LaunchAgents..."
        for plist in "$user_home/Library/LaunchAgents"/*ai.zs.zs*.plist \
                     "$user_home/Library/LaunchAgents"/*ai.we360.MyZenV2*.plist \
                     "$user_home/Library/LaunchAgents"/launcher.ai.zs.*.plist \
                     "$user_home/Library/LaunchAgents"/launcher.ai.we360.*.plist; do
            if [ -e "$plist" ]; then
                # Unload as the specific user
                unload_and_remove "$plist" "false" "$username"
            fi
        done
    fi
    
    # Process user LaunchDaemons (less common but possible)
    if [ -d "$user_home/Library/LaunchDaemons" ]; then
        echo "  Checking LaunchDaemons..."
        for plist in "$user_home/Library/LaunchDaemons"/*ai.zs.zs*.plist \
                     "$user_home/Library/LaunchDaemons"/*ai.we360.MyZenV2*.plist \
                     "$user_home/Library/LaunchDaemons"/launcher.ai.zs.*.plist \
                     "$user_home/Library/LaunchDaemons"/launcher.ai.we360.*.plist; do
            if [ -e "$plist" ]; then
                # Unload with sudo for daemons
                unload_and_remove "$plist" "true" ""
            fi
        done
    fi
    
    # Clean up application files for this user
    echo "  Cleaning application files..."
    sudo rm -rf "$user_home/Applications/MyZenV2.app" 2>/dev/null || true
    sudo rm -rf "$user_home/Applications/MyZenV2s.app" 2>/dev/null || true
    sudo rm -rf "$user_home/Applications/zs.app" 2>/dev/null || true
    
    # Clean up application support files
    echo "  Cleaning application support..."
    sudo rm -rf "$user_home/Library/Application Support/zs" 2>/dev/null || true
    sudo rm -rf "$user_home/Library/Application Support/MyZenV2" 2>/dev/null || true
    sudo rm -rf "$user_home/Library/Application Support/MyZenV2s" 2>/dev/null || true
    
    # Clean up preference files
    echo "  Cleaning preferences..."
    sudo rm -f "$user_home/Library/Preferences/com.zs.zs.plist" 2>/dev/null || true
    sudo rm -f "$user_home/Library/Preferences/ai.zs.zs.plist" 2>/dev/null || true
    sudo rm -f "$user_home/Library/Preferences/com.zenstack.MyZenV2.plist" 2>/dev/null || true
    sudo rm -f "$user_home/Library/Preferences/com.zenstack.MyZenV2s. plist" 2>/dev/null || true
    
    # Kill processes running as this user
    echo "  Stopping processes for user..."
    sudo -u "$username" pkill -9 svcmonitor 2>/dev/null || true
    sudo -u "$username" pkill -9 configure_user 2>/dev/null || true
    sudo -u "$username" pkill -9 zen_cli 2>/dev/null || true
    sudo -u "$username" pkill -9 ffmpeg 2>/dev/null || true
    sudo -u "$username" pkill -9 MyZenV2s 2>/dev/null || true
    sudo -u "$username" pkill -9 MyZenV2 2>/dev/null || true
    sudo -u "$username" pkill -9 zs 2>/dev/null || true
    
done < <(get_real_users)

# Clean up system-wide application files
echo ""
echo "=== Cleaning system-wide application files ==="
sudo rm -rf /usr/local/zs 2>/dev/null || true
sudo rm -rf /Applications/MyZenV2.app 2>/dev/null || true
sudo rm -rf /Applications/MyZenV2s.app 2>/dev/null || true
sudo rm -rf /Applications/zs.app 2>/dev/null || true

# Final cleanup - kill any remaining processes system-wide
echo ""
echo "=== Final process cleanup ==="
sudo pkill -9 svcmonitor 2>/dev/null || true
sudo pkill -9 configure_user 2>/dev/null || true
sudo pkill -9 MyZenV2s 2>/dev/null || true
sudo pkill -9 MyZenV2 2>/dev/null || true
sudo pkill -9 zs 2>/dev/null || true

echo ""
echo "✓ Cleanup complete for all users!"