#!/bin/bash

# boot firmware
firmware (){
FIRMWARE="https://github.com/raspberrypi/firmware.git"
echo ""
echo -en "Firmware"
echo -en " ${PNK}[${FIN}${WHT}downloading${FIN}${PNK}]${FIN}"
rm -fdr firmware
git clone -q -n --filter=tree:0 --sparse ${FIRMWARE} tmp &> /dev/null
cd tmp
git sparse-checkout set --no-cone --quiet boot &> /dev/null
git checkout --quiet &> /dev/null
rm -fdr boot/{overlays,*.dtb,kernel*}
mv boot ../firmware
cd ..
rm -fdr tmp
echo -en " ${PNK}[${FIN}${WHT}checking${FIN}${PNK}]${FIN}"
if [[ `ls firmware/{fixup4.dat,fixup4cd.dat,fixup4db.dat,fixup4x.dat,start4.elf,start4cd.elf,start4db.elf,start4x.elf}` ]] > /dev/null 2>&1; then
	:;
else
	echo -en " ${YLW}[${FIN}${RED}failed${FIN}${YLW}]${FIN}"; echo ""
	exit 0
fi
if [[ `ls firmware/{bootcode.bin,fixup.dat,fixup_cd.dat,fixup_db.dat,fixup_x.dat,start.elf,start_cd.elf,start_db.elf,start_x.elf}` ]] > /dev/null 2>&1; then
	echo -e " ${PNK}[${FIN}${GRN}done${FIN}${PNK}]${FIN}"
else
	echo -en " ${YLW}[${FIN}${RED}failed${FIN}${YLW}]${FIN}"; echo ""
	exit 0
fi
}

# check log and report
check_log (){
if [[ -f "${LOG_FILE}" ]]; then
	PATHTOFILE=`echo ${LOG_FILE} | sed 's/..\/..\///g'`
	if [[ `grep "Skipping patch" "${LOG_FILE}"` ]]; then
		SKIPPING="true"
		grep "Skipping patch" "${LOG_FILE}" | echo -en " ${PNK}[${FIN}"${WHT}skipping${FIN} ${WHT}`wc -l`${FIN}"${PNK}]${FIN}"
	else
		SKIPPING="false"
	fi
	if [[ `grep "FAILED" "${LOG_FILE}"` ]]; then
		FAILED="true"
		grep "FAILED" "${LOG_FILE}" | echo -en " ${PNK}[${FIN}"${RED}fails${FIN} ${WHT}`wc -l`${FIN}"${PNK}]${FIN}"
		if [ $VERBOSE -eq 1 ]; then
			echo -en " ${WHT}log: ${PATHTOFILE}${FIN}"
			exit 0
		fi
	else
		FAILED="false"
	fi
	if [[ "$SKIPPING" == "true" ]] && [[ "$FAILED" == "false" ]]; then
		echo -en " ${PNK}[${FIN}${YLW}done${FIN}${PNK}]${FIN}"
	fi
	if [[ "$SKIPPING" == "false" ]] && [[ "$FAILED" == "false" ]]; then
		echo -en " ${PNK}[${FIN}${GRN}done${FIN}${PNK}]${FIN}"
	fi
	echo -en " ${WHT}log: ${PATHTOFILE}${FIN}"
	echo -e ""
fi
}

# linux patch log
linux_log (){
LOG_DIR="../../output/logs"
LOG_FILE="${LOG_DIR}/${BOARD}-patch.log"
if [[ -f "${LOG_FILE}" ]]; then
	mv -f ${LOG_FILE} ${LOG_FILE}.1
	echo "Linux ${VERSION}" > ${LOG_FILE}
	echo `date` >> ${LOG_FILE}
else
	mkdir -p ${LOG_DIR}
	echo "Linux ${VERSION}" > ${LOG_FILE}
	echo `date` >> ${LOG_FILE}
fi
}

# linux user patch log
linux_user_log (){
LOG_DIR="../../output/logs"
LOG_FILE="${LOG_DIR}/${BOARD}-user-patch.log"
if [[ -f "${LOG_FILE}" ]]; then
	mv -f ${LOG_FILE} ${LOG_FILE}.1
	echo "Linux ${VERSION}" > ${LOG_FILE}
	echo `date` >> ${LOG_FILE}
else
	mkdir -p ${LOG_DIR}
	echo "Linux ${VERSION}" > ${LOG_FILE}
	echo `date` >> ${LOG_FILE}
fi
}

# linux apply patches
linux_patches (){
linux_log
echo "" >> ${LOG_FILE}
echo "# APPLYING PATCHES" >> ${LOG_FILE}
echo -en "${WHT}Patches${FIN} ${PNK}[${FIN}${WHT}applying${FIN}${PNK}]${FIN}"
if [[ -d "../../patches/all/${VERSION}" ]]; then
	if [[ `ls ../../patches/all/${VERSION}/*.patch` ]] > /dev/null 2>&1; then
		for i in ../../patches/all/${VERSION}/*.patch; do patch -N -p1 < $i; done >> ${LOG_FILE}
	fi
fi
# wireless
if [ $RTW88 -eq 1 ] && [[ -d "../../patches/wireless/rtw88" ]]; then
	if [[ `ls ../../patches/wireless/rtw88/{Kconfig,Makefile}` ]] > /dev/null 2>&1; then
		cp -fr ../../patches/wireless/rtw88/{Kconfig,Makefile} drivers/net/wireless/realtek/${DRIVER}/
	fi
	if [[ `ls ../../patches/wireless/rtw88/hack/*.patch` ]] > /dev/null 2>&1; then
		echo "# wireless/rtw88/hack" | sed -e 's/\(.*\)/\U\1/' >> ${LOG_FILE}
		for i in ../../patches/wireless/rtw88/hack/*.patch; do patch -N -p1 < $i; done >> ${LOG_FILE}
	fi
fi
check_log
}

# user patches
user_patches (){
if [[ `ls ../../patches/userpatches/*.patch` ]] > /dev/null 2>&1; then
	linux_user_log
	echo "" >> ${LOG_FILE}
	echo "# APPLYING USER PATCHES" >> ${LOG_FILE}
	echo -en "${WHT}User Patches${FIN} ${PNK}[${FIN}${WHT}applying${FIN}${PNK}]${FIN}"
	for i in ../../patches/userpatches/*.patch; do patch -N -p1 < $i; done >> ${LOG_FILE}
	check_log
fi
}

# patching and packaging
linux_patching (){
rm -f scripts/package/{builddeb,mkdebian}
cp -fr ../../packaging/{builddeb,mkdebian} scripts/package/
chmod +x scripts/package/{builddeb,mkdebian}
if [[ -f "../../packaging/dtclist.txt" ]] && [[ -f "../../packaging/initrd" ]] && [[ -f "../../packaging/headers-byteshift.patch" ]]; then
	cp -fr ../../packaging/{dtclist.txt,initrd,headers-byteshift.patch} .
else
	echo -e "An essential builddeb file is missing."
	exit 0
fi
if [[ -v "LINUX_LOGO" ]] && [[ ! -z "$LINUX_LOGO" ]]; then
	if [[ -f "../../packaging/logo/${LINUX_LOGO}" ]]; then cp -f "../../packaging/logo/${LINUX_LOGO}" "drivers/video/logo/logo_linux_clut224.ppm"; fi
fi
if [[ -f "arch/${ARCH}/Kconfig" ]] && [[ "$ARCH" == "arm64" ]]; then
	# REVERT: arm64/Kconfig: Don't set DMA_BOUNCE_UNALIGNED_KMALLOC
	# If enabled, DMA_BOUNCE_UNALIGNED_KMALLOC causes the swiotlb buffers (64MB, by default) to be allocated, even on systems
	# where the DMA controller can reach all of RAM.
	sed -i 's/	# select DMA_BOUNCE_UNALIGNED_KMALLOC/	select DMA_BOUNCE_UNALIGNED_KMALLOC/g' arch/arm64/Kconfig
fi
linux_patches
user_patches
linux_packaging
echo -e ""
}
