#!/usr/bin/env bash
set -o errexit
set -o nounset
set -o pipefail

function upgrade_brew() {
	echo "brew"
	local outdated
	outdated=$(brew outdated --quiet)
	if [[ -n "$outdated" ]]; then
		printf "Outdated macOS brew packages:\n$outdated\n"
		read -p 'Would you like to upgrade Brew (y/n): ' upgradeBrew
		if [[ "$upgradeBrew" == "y" ]]; then
			# sometimes corepack will prevent brew from overwriting npm
			brew upgrade || brew link --overwrite node
		fi
	fi
}

function upgrade_apt() {
  if type snap 2>/dev/null ; then
		echo "snap refresh"
		sudo snap refresh || true
	fi
	echo "apt update"
	sudo apt update
	echo "apt list --upgradable"
  if (("$(apt list --upgradeable 2>/dev/null | wc -l )" >=2)); then
		echo "You have outdated packages"
		apt list --upgradeable
		read -p 'Would you like to upgrade APT (y/n): ' upgradeApt
		if [[ "$upgradeApt" == "y" ]]; then
			sudo apt upgrade
		fi
	fi

}

function upgrade_zsh() {
	echo "zsh plugins"
	read -p 'Would you like to upgrade zsh plugins (y/n): ' upgradeZsh
	if [[ "$upgradeZsh" == "y" ]] && type zsh 1>/dev/null 2>&1 ; then
		ZSH_SKIP_LOADING_PLUGINS=1 zsh -lic "
		set -o errexit
		set -o nounset
		set -o pipefail
		set -o xtrace
		type update_plugins >/dev/null 2>&1 && update_plugins
		set +x"
	fi
}

function upgrade_neovim_plugins() {
	echo "neovim plugins"

	read -p 'Would you like to upgrade Neovim plugins (y/n): ' upgradeNvim
	if [[ "$upgradeNvim" == "y" ]]; then
		nvim --headless -c "lua vim.pack.update(nil, { force = true })" -c "qall"
		printf "\n"
	fi
}


function upgrade_npm() {
	read -p 'Would you like to upgrade Node (y/n): ' upgradeNode
	if [[ "$upgradeNode" == "y" ]]; then
		npm outdated || true
		echo "npm update --global"
		if [[ $OSTYPE != "darwin"* ]]; then
			bun upgrade
			bun update -g --latest
			sudo npm install npm --global --force
			sudo npm update --global
		else
			if [[ $USER == bytedance ]]; then
				bun --registry=https://bnpm.byted.org update -g --latest
				npm install npm --global --force --registry https://bnpm.byted.org
				npm update --global --registry https://bnpm.byted.org
			else
				bun update -g --latest
				npm install npm --global --force
				npm update --global
			fi
		fi
	fi
}

function upgrade_app_store() {
	echo "App Store"
	# open "macappstore://showUpdatesPage"
	local outdated=$(mas outdated)
	if [[ -n "$outdated" ]]; then
		printf "Outdated macOS App Store apps:\n$outdated\n"
		read -p 'Would you like to upgrade apps?  (y/n): ' upgradeApps
		if [[ "$upgradeApps" == "y" ]]; then
			mas upgrade
		fi
	fi

	echo
}

function upgrade_macos() {
	echo "macOS"
	local outdated=$(softwareupdate --list)

	local outdated_count=$(echo "$outdated" | grep -c "*")

	if [[ "$outdated_count" -gt 0 ]]; then
		read -p 'Would you like to upgrade macOS (y/n): ' upgradeMacOS
		if [[ "$upgradeMacOS" == "y" ]]; then
			softwareupdate --install --all --verbose
		fi
	fi
}

if [[ $OSTYPE == "darwin"* ]]; then
	upgrade_brew
else
	upgrade_apt
fi
upgrade_zsh
upgrade_neovim_plugins
upgrade_npm
if [[ $OSTYPE == "darwin"* ]]; then
	upgrade_app_store
	upgrade_macos
fi

