#!/usr/bin/env bash
. colors
[[ -e /etc/brand.conf ]] &&	source /etc/brand.conf
[[ -z $BRAND ]] && BRAND="Hive"

#------------------------------------------------------------------------------------------------------------------

function update() {
	#apt-get update -o Dir::Etc::sourcelist=hiverepo.list
	#apt-get update
	apt-get update --fix-missing -o Dir::Etc::sourcelist="sources.list.d/hiverepo.list" -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0"
	exitcode=$?
	[[ $exitcode -ne 0 ]] &&
		echo -e "${RED}Repository update failed${NOCOLOR}" &&
		return $exitcode ##don't exit as some mirrors can fail

	return 0
}

#------------------------------------------------------------------------------------------------------------------

function list() {
	suffix=
	[[ ! -z $1 ]] && suffix="-$1"

	apt list --installed "hive$suffix*" 2>&1
}

function list_kernels() {
	suffix=
	i=1
	[[ ! -z $1 ]] && suffix="-$1"
	echo -e "${WHITE}>>> Current boot: ${CYAN}$(uname -r)"
	echo
	echo -e "${WHITE}>>> Installed kernels:${GREEN}"
	installed=($(apt list -qqq  --installed "hiveos-kernel-*" 2>/dev/null | sed 's|/.*||g'))
	for choice in "${installed[@]}"; do
	echo -e "\t$((i++))) ${choice}"
	done
	echo -e "${WHITE}For boot specified kernel, use ${YELLOW}'hpkg kernel select'${NOCOLOR}"
	echo
	i=1
	echo -e "${WHITE}>>> Available kernels in repo:${CYAN}"
	available=($(apt list -qqq  "hiveos-kernel-*" 2>/dev/null | sed 's|/.*||g'))
	for choice in "${available[@]}"; do
	echo -e "\t$((i++))) ${choice}"
	done
	echo -e "${WHITE}For install or reinstall specified kernel, use ${YELLOW}'hpkg kernel install'${NOCOLOR}"
	
}

function install_kernels() {
	echo
	i=1
	echo -e "${WHITE}>>> Available kernels in repo:${CYAN}"
	available=($(apt list -qqq  "hiveos-kernel$suffix*" 2>/dev/null | sed 's|/.*||g'))
	PS3="${WHITE}Enter a number:${NOCOLOR} "
	select choice in "${available[@]}"; do
	echo "${NOCOLOR}"
	#"${choice}"
	apt-cache depends "${choice}" | grep '[ |]Depends: [^<]' | cut -d: -f2 | tr -d ' ' | xargs sudo apt-get --reinstall install -yqqq --ignore-hold --allow-change-held-packages
	apt install -yqqq --reinstall --ignore-hold --allow-change-held-packages "${choice}"
	break
	done
	i=1
	echo -e "${WHITE}>>> Installed kernels:${GREEN}"
	installed=($(apt list -qqq  --installed "hiveos-kernel$suffix*" 2>/dev/null | sed 's|/.*||g'))
	for choice in "${installed[@]}"; do
	echo -e "\t$((i++))) ${choice}"
	done
	echo -e "${WHITE}For boot specified kernel, use ${YELLOW}'hpkg kernel select'${NOCOLOR}"
	echo

}

function select_kernel() {
	echo
	i=1
	echo -e "${WHITE}>>> Current boot: ${CYAN}$(uname -r)"
	echo
	echo -e "${WHITE}>>> Available boot kernels:${CYAN}"
	#available=($(grep menuentry /boot/grub/grub.cfg |grep hiveos-advanced |awk -F\' '{print $2 }'))
	available=($(ls /boot/vmlinuz-* ))
	#available=('Hive OS, with Linux 6.14.0-hiveos' 'Hive OS, with Linux 6.12.0-hiveos' )
	PS3="${WHITE}Enter a number:${NOCOLOR} "
	#echo "${avaliable[@]}"
	select choice in "${available[@]}"; do
	echo "${NOCOLOR}"
	rootuuid=`findmnt / -o UUID -n`
	choice=${choice#*-}
	echo 'GRUB_DEFAULT="gnulinux-advanced-'${rootuuid}'>gnulinux-'${choice}'-advanced-'${rootuuid}'"' > /etc/default/grub.d/default-boot.cfg
	echo -e "Update grub loader"
	update-grub 2>/dev/null
	break
	done
	echo -e "${WHITE}Select default boot to \"${choice}\". Please reboot your rig.${NOCOLOR}"
	echo

}

#------------------------------------------------------------------------------------------------------------------

function getlist() {
	packages=$(list $1 | grep -o "hive.*/")
	for package_name in $packages; do
		package_name=${package_name//\//}
		echo "$package_name"
	done
}

#------------------------------------------------------------------------------------------------------------------

function remove_miners() {
	#packages=`apt list --installed 'hive-miners-*' 2>&1 | grep -o "hive-miners-.*-.*/"`
	packages=$(getlist miners)
	[[ -z $packages ]] && echo "Nothing to uninstall" && exit 0

	local mn=0
	if miner status >/dev/null; then
		echo -e "${CYAN}> Stopping miners${NOCOLOR}"
		miner stop
		mn=1
	fi

	echo
	echo -e "${CYAN}> Uninstalling packages${NOCOLOR}"
	for package_name in $packages; do
		#package_name=${package_name//\//}
		echo -e "${YELLOW}- $package_name${NOCOLOR}"

		apt remove -y $package_name

		echo
	done

	apt-get -y autoremove
	apt-get clean



	echo
	if [[ $1 == "noinstall" ]]; then
		echo -e "${CYAN}> Skipping installing default miners${NOCOLOR}"
		exit 0
	fi


	echo -e "${CYAN}> Updating repository${NOCOLOR}"
	update

	echo -e "${CYAN}> Checking miners default installation${NOCOLOR}"
	. $RIG_CONF

	for mindex in {1..32}; do
		[[ $mindex -eq 1 ]] && mindex=
		local -n minerval="MINER$mindex"
		if [[ ! -z $minerval ]]; then
			package_name="hive-miners-$minerval"
			dpkg -s $package_name 2>/dev/null | grep -q "installed"
			if [[ $? -ne 0 ]]; then
				echo -e "${YELLOW}+ $package_name${NOCOLOR}"
				apt-get install -y -f $package_name
				echo
			fi
		fi
	done

	echo
	[[ $1 == "nostart" || $1 == "noinstall" ]] &&
		echo -e "${CYAN}> Skipping restarting miner${NOCOLOR}" &&
		exit 0

	[[ $mn -ne 0 ]] &&
		echo -e "${CYAN}> Restarting miner${NOCOLOR}" &&
		miner start

}

#------------------------------------------------------------------------------------------------------------------

function install_miners_all() {
	echo -e "${CYAN}> Updating repository${NOCOLOR}"

	update || exit $?

	packages=$(apt list "hive-miners-*" 2>&1 | grep -o "hive-miners-.*/" | grep -v '[0-9]')
	[[ ! -z $1 ]] && #filter packages
		packages=$(echo "$packages" | grep "\-$1/\$") #packages end up with /


	packages_count=0
	[[ ! -z $packages ]] &&
		packages_count=$(echo "$packages" | wc -l)

	[[ $packages_count == 0 ]] &&
		echo -e "${YELLOW}No \"$1\" found in \"hive-miners-*\" packages ${NOCOLOR}" &&
		exit 1

	echo -e "${CYAN}> Installing $packages_count miners${NOCOLOR}"

	for package_name in $packages; do
		package_name=${package_name//\//}

		echo -en "${CYAN}$package_name${NOCOLOR} "

		dpkg -s $package_name 2>/dev/null | grep -q "installed"
		if [[ $? -ne 0 ]]; then
			echo -e "${YELLOW}Installing${NOCOLOR}"

			apt-get install -y -f $package_name 2>&1 | tee /tmp/package-install.log
			exitstatus=${PIPESTATUS[0]}

			[[ $exitstatus -ne 0 ]] &&
				echo -e "${RED}Error installing $package_name${NOCOLOR}"
		else
			echo -e "${GREEN}Installed${NOCOLOR}"
		fi
	done

	apt-get clean

	repover-touch
}

#------------------------------------------------------------------------------------------------------------------

function check_packages() {
	local exitcode=0
	for package_name in `dpkg-query -f '${package} ${status}\n' -W | grep " half-" | cut -d" " -f1`; do
		echo -e "${RED}> $package_name is broken${NOCOLOR}"
		((exitcode++))
	done
	return $exitcode
}

#------------------------------------------------------------------------------------------------------------------

function fix_packages() {
	local exitcode
	dpkg --configure -a
	exitcode=$?
	for package_name in `dpkg-query -f '${package} ${status}\n' -W | grep " half-" | cut -d" " -f1`; do
		echo -e "${YELLOW}> Reinstalling broken package $package_name${NOCOLOR}"
		apt install -y --reinstall $package_name || exitcode=$?
	done
	return $exitcode
}

#------------------------------------------------------------------------------------------------------------------

if [[ $1 == "kernel" ]]; then
	case $2 in 
		list)
		    list_kernels;;
		install)
		    install_kernels;;
		select)
		select_kernel;;
	esac
elif [[ $1 == "purge" ]]; then
	fix_packages
	remove_miners "noinstall"
elif [[ $1 == "remove" && $2 == "miners" ]]; then
	remove_miners $3
elif [[ $1 == "list" ]]; then
	[[ $2 == "kernels" ]] && list_kernels || list $2
elif [[ $1 == "getlist" ]]; then
	getlist $2
elif [[ $1 == "update" ]]; then
	update
elif [[ $1 == "install" && $2 == "miners" ]]; then
	install_miners_all $3
elif [[ $1 == "check" ]]; then
	check_packages
elif [[ $1 == "fix" ]]; then
	fix_packages
else
	echo -e "${CYAN}$BRAND Package Manager${NOCOLOR}
${YELLOW}update${NOCOLOR} - update packages list from repository
${YELLOW}check${NOCOLOR} - check for broken packages
${YELLOW}fix${NOCOLOR} - reinstall broken packages
${YELLOW}purge${NOCOLOR} - remove all miners
${YELLOW}list${NOCOLOR} - list all installed $BRAND packages
${YELLOW}list miners${NOCOLOR} - list only miners packages
${YELLOW}getlist${NOCOLOR} - list without versions
${YELLOW}remove miners${NOCOLOR} - uninstall miners
${YELLOW}remove miners nostart${NOCOLOR} - don't run miners
${YELLOW}remove miners noinstall${NOCOLOR} - don't run and don't install default packages
${YELLOW}install miners${NOCOLOR} - install all available miners, useful for preparing PXE image
${YELLOW}install miners [ethminer]${NOCOLOR} - install specific miner"
echo
echo -e "${CYAN}Manage System Kernels${NOCOLOR}"
echo -e "${YELLOW} kernel list${NOCOLOR} - list all available kernels"
echo -e "${YELLOW} kernel install${NOCOLOR} - install specified kernel"
echo -e "${YELLOW} kernel select${NOCOLOR} - select to boot specified kernel"

fi

exit
