#!/bin/bash

nanodroid_missing_files=0
nanodroid_broken_files=0
missing_database=""

sideload=${CWD}/local

debug_message () {
	[ "${BP_DEBUG}" != '1' ] && return 0
	case "$1" in
		normal)
			echo "$3$(tput setaf 3)$2$(tput sgr 0)"
		;;
		newline)
			echo -e "$3$(tput setaf 3)$2$(tput sgr 0)"
		;;
	esac
}

check_nanodroid () {
	# check for gzip'ed APKs (we switched to ZStd with NanoDroid 23.0) and remove them
	find Full/ -type f -name '*.apk.gz' | xargs rm -fv

	for file in ${file_database[@]}; do
		if [[ ! -f ${CWD}/${file} ]]; then
			nanodroid_missing_files=1
			missing_database=(${missing_database[@]} ${file})
		else
			case ${file} in
				*.zst )
					mimetype=$(file -b --mime-type ${CWD}/${file})
					mimetype_int=$(zstd -dcf ${CWD}/${file} 2>/dev/null | file -b --mime-type - )
				;;

				*.so* )
					mimetype=$(file -b --mime-type ${CWD}/${file})
					mimetype_int=""
				;;
			esac

			case ${mimetype} in
				*application/*sharedlib* )
					# library
				;;

				*application/*zstd* )
					# APK
				;;

				* )
					debug_message newline "${file} has non-supported mimetype ${mimetype}"
					nanodroid_broken_files=1
					broken_database=(${broken_database[@]} ${file})
					[ "${BP_DEBUG}" != '1' ] && rm -f ${CWD}/${file}
				;;
			esac

			case ${mimetype_int} in
				"" )
					# library
				;;

				*application/java-archive* | *application/zip* )
					# APK
				;;

				* )
					debug_message newline "compressed ${file} has non-supported mimetype ${mimetype_int}"
					nanodroid_broken_files=1
					broken_database=(${broken_database[@]} ${file})
					[ "${BP_DEBUG}" != '1' ] && rm -f ${CWD}/${file}
				;;
			esac
		fi
	done

	if [[ ${nanodroid_missing_files} -ne 0 ]]; then
		echo -e "\nThe following files are missing:\n"
		printf '%s\n' ${missing_database[@]} | uniq | sort
	fi

	if [[ ${nanodroid_broken_files} -ne 0 && "${BP_DEBUG}" -ne 1 ]]; then
		echo -e "\nThe following files are broken (and will be removed):\n"
		printf '%s\n' ${broken_database[@]} | uniq | sort
	elif	[[ ${nanodroid_broken_files} -ne 0 && "${BP_DEBUG}" -eq 1 ]]; then
		echo -e "\nThe following files are broken (and are kept because BP_DEBUG is set):\n"
		printf '%s\n' ${broken_database[@]} | uniq | sort
	fi

	if [[ ${nanodroid_missing_files} -eq 0 && ${nanodroid_broken_files} -eq 0 ]]; then
		echo -e "\nNanoDroid correctly populated\n"
		return 0
	else	return 1
	fi
}

update_patches () {
	grab_patches sigspoof-core/services.jar.dex core_services.jar.dex
	grab_patches sigspoof-hook-4.1-6.0/services.jar.dex hook_4.1-6.0_services.jar.dex
	grab_patches sigspoof-hook-7.0-9.0/services.jar.dex hook_7.0-9.0_services.jar.dex
}

progress () {
	sleep 0.5
	while [ -d "/proc/${1}" ];do
		echo -ne '/\x08' ; sleep 0.05
		echo -ne '-\x08' ; sleep 0.05
		echo -ne '\\\x08' ; sleep 0.05
		echo -ne '|\x08' ; sleep 0.05
	done

	echo "Done"
}

zip_add () {
	local file_path="${CWD}/${1}"
	local file_mask="${2}"
	local zip_path="${CWD}/${ZIP}"

	cd "${file_path}"

	if [ -z "${file_mask}" ]; then
		zip -qr "${zip_path}" . || exit 1
	elif [ -d "${file_mask}" ]; then
		zip -qr "${zip_path}" "${file_mask}"  || exit 1
	else
		zip -q "${zip_path}" ${file_mask} || exit 1
	fi

	cd "${CWD}"
}

zip_add_setup () {
	cd "${CWD}/doc"

	local zip_path="${CWD}/${ZIP}"

	case ${1} in
		0 )
			sed -e 's/nanodroid_overlay=1/nanodroid_overlay=0/' -i .nanodroid-setup
			zip -q "${zip_path}" .nanodroid-setup || exit 1
			sed -e 's/nanodroid_overlay=0/nanodroid_overlay=1/' -i .nanodroid-setup
		;;

		1 )
			zip -q "${zip_path}" .nanodroid-setup || exit 1
		;;
	esac

	cd "${CWD}"
}

increase_version_number () {
	if [ -z ${2} ]; then
		date=99999999
	else	date=${2}
	fi

	[ -z ${1} ] && error "no new version number given (current: ${version_code})"

	for file in "CommonAddon" "CommonInstaller" \
		"systest/SysTest" "patcher/CommonPatcher" \
		"uninstaller/META-INF/com/google/android/update-binary"; do
		sed -e "s/^VERSION=.*/VERSION=${1}.${date}/" -i "${CWD}/${file}"
	done

	sed -e "s/^version_code.*/version_code=${1}/g" -i "${CWD}/build-package"
	sed -e "s/^version_date.*/version_date=${date}/g" -i "${CWD}/build-package"

	for module in Full microG FDroid BromiteWebView OsmAnd Google patcher/dexpatcher; do
		sed -e "s/version=.*/version=v${1}.${date}/" -i \
			"${CWD}/${module}/module.prop"
	done
}

increase_module_version () {
	for module in Full microG FDroid BromiteWebView OsmAnd Google patcher/dexpatcher; do
		eval $(grep versionCode "${CWD}/${module}/module.prop")
		local versionCode=$((versionCode+1))
		sed -e "s/versionCode.*/versionCode=${versionCode}/" \
			-i "${CWD}/${module}/module.prop"
	done
}

dalvikize_jar () {
	[ -z "${ANDROID_HOME}" ] && error "ANDROID_HOME is not set!"
	[ ! -f "${ANDROID_HOME}/build-tools/29.0.3/dx" ] && error "can't find 'dx' binary in \"${ANDROID_HOME}/build-tools/29.0.3\"!"
	[ -n "${2}" ] && local dx_extra_arg="--min-sdk-version=${2}"

	if [ -f "${1}" ]; then
		${ANDROID_HOME}/build-tools/29.0.3/dx --dex \
			--output="$(basename "${1}" .jar).dex" \
			${dx_extra_arg} "${1}"
	else
		error "can't find input file \"${1}\""
	fi
}

show_help () {
	echo -e "
** NanoDroid ${version_p} helper script **

usage:	build-package [opt] [arg]

setup NanoDroid [! do this first !]:
	pull			| download all required apks for NanoDroid

update contents:
	u-microg		| update microG and companions
	u-fdroid		| update F-Droid and Extension
	u-bromite		| update Bromite System WebView
	u-osmand		| update OsmAnd and Plugins
	u-apps			| update applications
	u-swipe			| update swipe libraries
	u-gsync			| update Google Sync Adapters
	u-patch			| download Haystack patches
				| currently disabled as we use new Haystack patches

create zip files:
	full			| create Full package zip from repo
	microg			| create microG package zip from repo
	fdroid			| create FDroid package zip from repo
	patcher			| create framework patcher zip from repo
	uninstaller		| create uninstaller zip from repo
	bromitewebview		| create Bromite WebView zip from repo
	osmand			| create OsmAnd package zip from repo
	google			| create Google package zip from repo
	all			| create all zips from repo

misc. stuff:
	check			| check if all files were properly downloaded
	clean			| remove any untracked files from the repo
	report			| create package report (work-in-progress)
	dalvik	[jar] [:minsdk]	| prepare a jar file for dalvikvm usage
	ver	[ver] [:date]	| bump version accross whole project
	bump			| increment Magisk Module versionCodes by 1

debugging:
	BP_DEBUG=1		| pass this to display lots of info useful for debugging
	BP_USE_WGET=1		| pass this to use wget instead of curl to download files
				| note: curl is still used for some tasks
"

	exit 0
}

print_package () {
		echo "
Creating Package

	Type		${1}
	Name		${ZIP}
	Directory	${CWD}
"

	rm -f "${CWD}/${ZIP}"*
}

error () {
	echo -e "${@}"
	exit 1
}

sum_sign_package () {
	cd "${CWD}"
	cd "$(dirname "${1}")"
	${sumsha256} "$(basename "${1}")" > "${1}.sha256"
	cd "${CWD}"
	gpg --sign --detach-sign "${1}.sha256"
}
