#!/bin/bash

get_patch(){ _get_patch; }

_get_patch(){
	cd $pdir
	[ -f patch.url ] && source patch.url
	clear
	printf $C
	ologo
	printf $WH;
	if [ -f patch.url.template -a ! -f patch.url ]
	then
		printf "${Y}To load custom patches,\nyou have to rename the file ${P}patch.url.template${Y} to ${G}patch.url${Y}\nand adjust accordingly.${W}\n\n"
		exit
	fi
	[ ! -z "$PATCHCOUNT" ] && loop="$(eval echo "{1..$PATCHCOUNT}")"
	for c in '' $loop; do
		DP="PATCHNAME$c"; PATCHNAME=${!DP}
		DU="PATCHURL$c"; PATCHURL=${!DU}
		if [ ! -z "$PATCHNAME" -a ! -z "$PATCHURL" ]
		then
			[ -f $PATCHNAME ] && printf "$Y $PATCHNAME $txt_found\n $txt_delete $P$PATCHNAME" && rm -f $PATCHNAME
			printf $W"\n $txt_load $PATCHNAME"

			if [[ `wget -S --spider $PATCHURL  2>&1 | grep 'HTTP/1.1 200 OK'` ]]
			then
				wget -q -O$PATCHNAME $PATCHURL
				[ -f $PATCHNAME ] && printf $G" ok$W\n\n"
			else
				printf $R"\n\n $PATCHURL\n\n >> $txt_not_found <<$W\n\n"
			fi
		fi
	done
}

_streamboard_patch(){
	if [ -e "$1" ]; then
		PATCHEDFILES=$(grep -e '^\(---\|+++\) ' -i "$1" | grep -v /dev/null | awk '{print $2}' | sort | uniq)
		for f in ${PATCHEDFILES[@]}; do
			[[ -e "${repodir}/$f" ]] && return 0
		done
	fi
	return 1
}

_apply_menupatch(){
	[ -f "$workdir/GIT-IS-PATCHED" ] && quickreporestore $_toolchainname 2>/dev/null
		cd "$pdir"
			(if [ "$(ls -1 "$pdir"/*.patch 2>/dev/null | wc -l)" -gt "0" ]
			then

				cd "$pdir"
				unset patchlist
				patchlist=`ls *.patch | sort -st '/' -k1,1`
				patchlog="$(mktemp)"

				for e in ${patchlist[@]}
				do

					_w="ok"
					cd "${repodir}"
					echo -e "\n$e" >> "$patchlog"
					if _streamboard_patch "$pdir/$e"; then
						SKIPPATHS=-p0
						printf "PATCH : apply streamboard-style patch $e"
					else
						SKIPPATHS=-p1
						printf "PATCH : apply regular patch $e"
					fi
					if grep 'GIT binary patch' "$pdir/$e" &>/dev/null; then
						printf "PATCH : binary patch detected, using git apply for $e"
						git apply --verbose $SKIPPATHS < "$pdir/$e" >>"$patchlog" 2>/dev/null
					else
						patch -f $SKIPPATHS < "$pdir/$e" >>"$patchlog" 2>/dev/null
					fi
					hunks=$(grep -c1 '^Hunk' "$patchlog")
					fails=$(grep -c1 'hunks FAILED' "$patchlog")

					if [ "$hunks" -gt "0" ]
					then
						printf "PATCH : $hunks x HUNK for $e"
						_w="hunk"
					fi

					if [ "$fails" -gt "0" ]
					then
						printf "PATCH : $fails x FAILS for $e"
						_w="fail"
					fi

				done

				case $_w in
					ok)
							printf "PATCH : done all ok";;
					hunk)
							printf "PATCH : done with warnings save $e.log"
							cp -f $patchlog "$ldir/$e.log"
							ln -frs "$ldir/$e.log" "$workdir/lastpatch.log";;
					fail)
							printf "PATCH : break build save $e.log"
							cp -f $patchlog "$ldir/$e.log"
							ln -frs "$ldir/$e.log" "$workdir/lastpatch.log";;
				esac

				mark_patched
				rm -rf "$patchlog"
			fi;)|"$gui" "$st_" "$bt_" "$title_" "$pb_" 12 62
				sleep 2
}

_apply_consolepatch(){
	if [ ! -f "$workdir/${REPO^^}-IS-PATCHED" ]
	then

		cd "$pdir"
		if [ "$(ls -1 "$pdir"/*.patch 2>/dev/null | wc -l)" -gt "0" ]
		then

			unset patchlist;patchlist=`ls *.patch | sort -st '/' -k1,1`
			patchlog="$(mktemp)"
			for e in ${patchlist[@]}
			do

				_w=0
				cd "${repodir}"
				echo -e "\n$e" >> "$patchlog"
				if _streamboard_patch "$pdir/$e"; then
					SKIPPATHS=-p0
					printf "$y_l\n |     PATCH : apply streamboard-style patch $e\n"
				else
					SKIPPATHS=-p1
					printf "$y_l\n |     PATCH : apply regular patch $e\n"
				fi
				if grep 'GIT binary patch' "$pdir/$e" &>/dev/null; then
					printf "$y_l\n |     PATCH : binary patch detected, using git apply for $e\n"
					git apply --verbose $SKIPPATHS < "$pdir/$e" >>"$patchlog" 2>/dev/null
				else
					patch -F 10 -f $SKIPPATHS < "$pdir/$e" >>"$patchlog" 2>/dev/null
				fi
				hunks=$(grep -c1 "^Hunk" "$patchlog")
				fails=$(grep -c1 "hunks FAILED" "$patchlog")

				cat $patchlog >"$ldir/$e.log";
				ln -frs "$ldir/$e.log" "$workdir/lastpatch.log";

				if [ "$hunks" -gt "0" ]
				then
					printf "$y_l\n |     PATCH :$w_l $hunks x HUNK for $e"
					_w=1
				fi

				if [ "$fails" -gt "0" ]
				then
					printf "$y_l\n |     PATCH :$r_n FAIL (breaking Build) = $fails"
					printf "$w_l\n |   RESTORE :$c_w LAST ${REPO^^} BACKUP in "
					for (( i=6; i>0; i--))
					do
						sleep 1 & echo -en "$i\b"
						wait
					done
					reporestore lastrepo;
					exit
				fi
			done

			rm -rf "$patchlog"

			if [ "$_w" -gt "0" ]
			then
				printf "$y_l\n |     PATCH : done with warnings"
			else
				printf "$y_l\n |     PATCH :$g_l done all ok$rs_"
			fi
			mark_patched

		else
			printf "$y_l\n |     PATCH : no patch found\n"
		fi
	fi
}

mark_patched(){
	patches="$(echo "${patchlist[@]}" | xargs | sed 's/ /\\n\\t\\t/g')"

	#mark oscam-${REPO} as patched
	echo "$patches" > "$workdir/${REPO}-IS-PATCHED"
}

patch_webif(){

	if [ -f "$workdir/${REPO^^}-IS-PATCHED" ]
	then
		if [ -s "$workdir/${REPO^^}-IS-PATCHED" ]
		then
			#format should be: patchname1.patch\n\t\tpatchname2.patch\n\t\tpatchname3.patch
			patches="yes\\n\\t\\t$(cat "$workdir/${REPO^^}-IS-PATCHED")"
		else
			patches='yes'
		fi

		#show patch file information in oscam WebIf
		sed -i '/^#define S3PATCHED/d' "${repodir}/config.h"
		sed -i "/^#endif \/\/OSCAM_CONFIG_H_/s/^/#define S3PATCHED \""$(printf '%q' $patches)"\"\n/" "${repodir}/config.h"
		sed -i '/#ifdef S3PATCHED/,+3d' "${repodir}/oscam.c"
		sed -i "/fprintf(fp, \"WebifPort:.*/s/$/\n#endif\n\n#ifdef S3PATCHED\n\tfprintf(fp, \"Patched:\\\t\%s\\\n\", S3PATCHED)\;/" "${repodir}/oscam.c"
	fi
}
