#!/usr/bin/env bash

# Read in the language file
source ${BBROOTDIR}/lang/${BBLANG}/burning.lang

# Read in common functions
source ${BBROOTDIR}/misc/commonfunctions.sh

########################## SMALL FUNCTIONS ##############################################

# A function to check if overburn is enabled
check_overburn()
{
	if [[ "${BBOVERBURN}" = "yes" ]]; then	# Is overburn enabled?
		BBOBURN="-overburn"		# yes it was
	else
		echo $bb_no_ob			# No it wasn't
		unset BBOBURN			
   fi
}

# A function to see if files in temp dir should be deleted after burning is done
check_tempdel()
{
   if [[ "${BBDELTEMPBURN}" = "yes" ]]; then
		rm -rf "${BBBURNDIR}"/*
		echo "$bb_burning_tmp_1 ${BBBURNDIR} $bb_burning_tmp_1b"
   else
		echo "$bb_burning_tmp_1 ${BBBURNDIR} $bb_burning_tmp_2"
   fi
}

# A function to see if audio files should be copy protected or not
# NOTE: The files will not be copy protected, but cdrecord will write
# into TOC that files are permitted to be copied or not.
check_copy()
{
   if [[ "${BBCOPY_PROTECT}" = "yes" ]]; then
		BBCOPYING="-nocopy"
   else
		BBCOPYING="-copy"
   fi
}

check_for_wavs()
{
   cd ${BBBURNDIR}
   while read WAVS; do
		existing="affirmative"
   done < <(find ${BBBURNDIR} -iname "*.[Ww][Aa][Vv]" | sort)
}

check_for_mp3s()
{
   cd ${BBBURNDIR}
   while read MP3S; do
		existing="positive"
   done < <(find ${BBBURNDIR} -iname "*.[Mm][Pp]3" | sort)
}

set_session_type()
{
    echo $bb_burning_dvd_1
    echo $bb_burning_dvd_2
    echo $bb_burning_dvd_3
    echo $bb_burning_dvd_4; echo
    echo -n $bb_burning_dvd_5
    read BB_SESSION_ANSWER    
}

################################ AUDIO ###################################################

# a function to burn audio cds.
# it looks for wav-files in the BBBURNDIR (/tmp/burn/)..

audio_burning()
{
   check_for_wavs
   if [[ "$existing" != "affirmative" ]]; then
	echo
	echo "$bb_burning_audio_2 ${BBBURNDIR}"
	wait_for_enter
   else
	if [[ "${BBNORMALIZE}" = "yes" ]]; then
   	cd "${BBBURNDIR}"
		${BB_NORMCMD} -m *.[Ww][Aa][Vv]
	else
		echo $bb_burning_audio_3
	fi
	check_overburn		# Overburn enabled?
	check_copy		# Copy protected?
	check_cd_status		# Check if CD is already written to
	ask_for_blanking
	
	if eval "${BB_CDBURNCMD} dev=${BBCDWRITER} speed=${BBSPEED} ${BBDTAO} ${BBOPT_ONE:+\"driveropts=$BBOPT_ONE\"} -audio ${BBPADDING} -eject -v ${BBOBURN} ${BBCOPYING} ${BBBURNDIR}/*.[Ww][Aa][Vv]"; then		#Burn audio cd
		echo; echo $bb_burning_finish_1
		check_tempdel
		wait_for_enter
	else
	 	echo $bb_burning_finish_2
		wait_for_enter
	fi
   fi
}

################################# ISO #############################################################

# to burn a .iso-file in the BURNDIR.
iso_burning()
{
   if [ "$(ls -A ${BBBURNDIR})" ]; then
	check_overburn
	# Check for type of image, iso or img supported
	if [[ "$(find ${BBBURNDIR} -iname '*[Ii][Ss][Oo]')" != "" ]]; then
	    	IMAGETYPE="[Ii][Ss][Oo]"
	elif [[ "$(find ${BBBURNDIR} -iname '*[Ii][Mm][Gg]')" != "" ]]; then
	    	IMAGETYPE="[Ii][Mm][Gg]"
	else
	   	echo "$bb_burning_error ${BBBURNDIR}  *.iso or *.img file[s] not found?"
		wait_for_enter
		${BBROOTDIR}/misc/datadefine.sh
		exit;
	fi
	check_cd_status		# Check if CD is already written to
	ask_for_blanking	# Check if CD blanking should be done
	if eval "${BB_CDBURNCMD} dev=${BBCDWRITER} speed=${BBSPEED} ${BBDTAO} ${BBPADDING} ${BBOPT_ONE:+\"driveropts=$BBOPT_ONE\"} -eject -v ${BBOBURN} ${BBBURNDIR}/*.$IMAGETYPE"; then
		echo; echo $bb_burning_finish_1
		check_tempdel
		wait_for_enter
	else
	   	echo $bb_burning_finish_2
		echo "$bb_burning_finish_3 ${BBBURNDIR} ?"
		wait_for_enter
	fi
   else
	echo "$bb_burning_error $BBBURNDIR"
	wait_for_enter
   fi
}

############################## DVD Image #########################################################

# DVD support. Not as well tested as CD-burning, but should work just fine.

dvd_image_burn()
{
   if [ "$(ls -A ${BBBURNDIR})" ]; then
	check_overburn
	# Check for type of image, iso or img supported
	if [[ "$(find ${BBBURNDIR} -iname '*[Ii][Ss][Oo]')" != "" ]]; then
	 	IMAGETYPE="[Ii][Ss][Oo]"
	elif [[ "$(find ${BBBURNDIR} -iname '*[Ii][Mm][Gg]')" != "" ]]; then
	    	IMAGETYPE="[Ii][Mm][Gg]"
	else
	    	echo "$bb_burning_error ${BBBURNDIR}  *.iso or *.img file[s] not found?"
		wait_for_enter
		${BBROOTDIR}/misc/datadefine.sh
		exit;
	fi
		check_cd_status		# Check if CD is already written to
	
	if eval "${BB_DVDBURNCMD} -dvd-compat -Z ${BBCDWRITER}=${BBBURNDIR}/`ls ${BBBURNDIR} | grep $IMAGETYPE`"; then
	  	echo; echo $bb_burning_finish_1
		check_tempdel
		wait_for_enter
	else
	    	echo $bb_burning_finish_2
		echo "$bb_burning_finish_3 ${BBBURNDIR} ?"
		wait_for_enter
	fi
   else
		echo "$bb_burning_error $BBBURNDIR"
		wait_for_enter
   fi
}

################################### DATA ##########################################################

# This is a function to burn all files in /tmp/burn/ as a data-CD.
# It checks whether folder is empty, and if not creates an ISO from its
# contents and burns it. It does NOT check if the folder contains an ISO
# anymore. If it does, it creates an ISO containing an ISO and burns it.
# This is due to lots of people wanting this functionality. 

data_burning()
{
   if [ "$(ls -A ${BBBURNDIR})" ]; then
	#### i want a question regarding the BBLABEL ####
	if [ "$BBLABEL" = "<ask-me>" ]; then
		read -p "$bb_burning_data_label" BBLABEL
	fi
	if eval "${BB_ISOCMD} -r -f -v -J -joliet-long -copyright \"$BBCOPYRIGHT\" -A \"$BBDESCRIPTION\" -p \"$BBAUTHOR\" -publisher \"$BBPUBLISHER\" -volset \"$BBNAMEOFPACKAGE\" -V \"$BBLABEL\" -o ${BBBURNDIR}/BashBurn.iso ${BBBURNDIR}"; then
		iso_burning			# call function - declared above
	else
		echo $bb_burning_data_2
		echo $bb_burning_data_3
		wait_for_enter
	fi
   else
	echo "$bb_burning_error $BBBURNDIR"
	wait_for_enter
   fi
}

################################### DVD Data #######################################################

# Preliminary DVD support. Not very well tested, use at your own risk.
# (However I do believe it should work as planned.)
# Better support will come in time.

dvd_data_burning()
{
   if [ "$(ls -A ${BBBURNDIR})" ]; then
   	if [[ "$BBLABEL" = "<ask-me>" ]]; then
		read -p "$bb_burning_data_label" BBLABEL
	fi
	set_session_type
	if [ "$BB_SESSION_ANSWER" = "yes" ]; then
		BB_DVDSESSION="-Z"
	elif [ "$BB_SESSION_ANSWER" = "no" ]; then
		BB_DVDSESSION="-M"
	else
		exit
	fi
	check_cd_status		# Check if CD is already written to
	if eval "${BB_DVDBURNCMD} ${BB_DVDSESSION} ${BBCDWRITER} -r -f -v -J -joliet-long -copyright \"$BBCOPYRIGHT\" -A \"$BBDESCRIPTION\" -p \"$BBAUTHOR\" -publisher \"$BBPUBLISHER\" -volset \"$BBNAMEOFPACKAGE\" -V \"$BBLABEL\" ${BBBURNDIR}"; then
		echo $bb_burning_finish_1
		wait_for_enter
	else
		echo $bb_burning_finish_2
		wait_for_enter
	fi
   else
	echo "$bb_burning_error $BBBURNDIR"
	wait_for_enter
   fi
}
	    
################################## PIPELINE ########################################################

# A function to do direct audio burning without creating wavs. This is butt ugly and might be
# removed or rewritten at one point. 

pipeline_burning()
{
   check_for_mp3s
   if [[ "$existing" != "positive" ]]; then
   	echo; echo "$bb_burning_audio_2 ${BBBURNDIR}"
	wait_for_enter
   else
 	#fifo counter set to 0
	COUNTER=0;
	FIFOLST="";
	COMMANDLST="";
	while read FILE; do
	#AAARG...suffixe determination is too ugly !
	if [[ "$( echo ${FILE} | sed -e 's/.*\.\(...\)$/\1/' | tr '[:lower:]' '[:upper:]'  )"x = "MP3x" ]]; then
		COUNTER=$[ ${COUNTER} + 1 ];
		FIFO="${BBFIFODIR}/FIFO$$-${COUNTER}";
		FIFOLST="${FIFOLST} ${FIFO}";
		COMMANDLST="${COMMANDLST} -audio ${FIFO}";
		mknod ${FIFO} p; #equivalent to mkfifo $FIFO
		exec ${BB_MP3DEC} -qs "${FILE}" 1> "${FIFO}" &
		echo ${COUNTER-MP3} $( echo $(basename "${FILE}") | head -c35 )  flushed into ${FIFO} \(pipe\).
	elif [[ "$( echo ${FILE} | sed -e 's/.*\.\(...\)$/\1/' | tr '[:lower:]' '[:upper:]'  )"x = "WAVx" ]]; then
		COUNTER=$[ ${COUNTER} + 1 ];
		IFOF="${BBFIFODIR}/FILE$$-${COUNTER}.wav";
		FIFOLST="${FIFOLST} ${IFOF}";
		ln -s "${FILE}" ${IFOF}
		COMMANDLST="${COMMANDLST} -audio ${IFOF}";
		echo ${COUNTER-WAV} $( echo $(basename "${FILE}") | head -c35 ).
	fi
		done < <(find ${BBBURNDIR} -iname \*[Mm][Pp]3 -o -iname \*[Ww][Aa][Vv])
	
	if [[ "${COUNTER}" = "0" ]]; then
	    	echo "$bb_burning_fifo_1 ${BBBURNDIR}"
		wait_for_enter
	fi
		echo "$bb_burning_fifo_2 ${COUNTER} $bb_burning_fifo_2b"
		check_copy		# Check copy protection
		check_cd_status		# Check if CD is already written to
		ask_for_blanking
		${BB_CDBURNCMD} dev=${BBCDWRITER} speed=${BBSPEED} ${BBDTAO} ${BBOPT_DRIVER:+"driver=$BBOPT_DRIVER"} fs=16m -swab -audio ${BBPADDING} -eject -v ${BBOBURN} ${BBCOPYING} ${COMMANDLST}
		echo $bb_burning_fifo_3
		rm ${FIFOLST}
		check_tempdel
   fi
}
    
# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
case "$1" in
    "--audio")
	 	audio_burning
		;;
    "--data")
	 	data_burning
		;;
    "--dvddata")
	 	dvd_data_burning
		;;
    "--dvdimage")
	 	dvd_image_burn
		;;
    "--iso")
	 	iso_burning
		;;
    "--pipeline")
	 	pipeline_burning
		;;
esac



syntax highlighted by Code2HTML, v. 0.9.1