#! /bin/sh
#
# 	Part of kde-service-menu-pdf Version 1.0
# 	Copyright (C) 2007-2018 Giuseppe Benigno <giuseppe.benigno(at)gmail.com>
#
# 	This program is free software: you can redistribute it and/or modify
# 	it under the terms of the GNU General Public License as published by
# 	the Free Software Foundation, either version 3 of the License, or
# 	(at your option) any later version.
#
# 	This program is distributed in the hope that it will be useful,
# 	but WITHOUT ANY WARRANTY; without even the implied warranty of
# 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# 	GNU General Public License for more details.
#
# 	You should have received a copy of the GNU General Public License
# 	along with this program.  If not, see <http://www.gnu.org/licenses/>.
#

if [ ${#} -eq 0 ] || [ "${1}" = "-h" ] || [ "${1}" = "--help" ]; then
	echo
	echo "USE:\t\t${0##*/} files"
	echo
	echo "files:\t\tfile1 file2 ..."
	echo
	echo "example:\t${0##*/} /home/user/file1.pdf /home/user/file2.pdf"
	echo
	exit 0
fi

#### languages strings messages #################
# Syntax for strings name is: msg_[$action]_$window_[$section]
# For languages as sr@Latn use srLatn

load_language_de () {
	msg_alert_pdftk_not_found_title="Komponente wurde nicht gefunden"
	msg_alert_pdftk_not_found_text="Die pdftk Software wurde nicht gefunden! Bitte installieren Sie pdftk."

	msg_alert_pdfnup_not_found_title="Komponente wurde nicht gefunden"
	msg_alert_pdfnup_not_found_text="Die pdfnup Software wurde nicht gefunden! Bitte installieren Sie pdfnup."

	msg_pages_per_booklet_title="Dokument \"${file_name}\""
	msg_pages_per_booklet="Seiten pro Booklet (vorschlagen: $pages_per_booklet_hint, Gesamte Seiten: $original_total_pages)"
	msg_orientation_title="Dokument \"${file_name}\""
	msg_orientation_text="Ausrichtung des Dokuments \"${file_name}\" auswählen"
	msg_orientation_left_to_right="Das Dokument liest sich von links nach rechts"
	msg_orientation_right_to_left="Das Dokument liest sich von rechts nach links (z.B. Hebräisch oder Arabisch)"
	msg_one_file="Wollen Sie alle Booklets in einer Datei?"
	msg_one_file_output_file_name="${base_file_name} (Booklet)"
	msg_save_file_title="Dokument speichern"
	msg_progressbar_dialog_title="Dokument \"${file_name}\""
	msg_progressbar_dialog_text="Wandle Dokument \"${file_name}\" in Booklet um"
	msg_progressbar_dialog_text2="Seiten werden umgewandelt ... "
	msg_progressbar_dialog_saving="Speichere Boocklet Nr."
	msg_progressbar_dialog_saving2="Speichere Booklet ..."

	msg_finish_title="Umwandlung von \"${file_name}\""
	msg_finish_ok="Fertig."
	msg_finish_error="Ein Fehler ist aufgetreten."
	msg_file_not_found="Datei nicht gefunden."
}

load_language_en () {
	msg_alert_pdftk_not_found_title="Component not found"
	msg_alert_pdftk_not_found_text="Software pdftk not found! Please, install it."

	msg_alert_pdfnup_not_found_title="Component not found"
	msg_alert_pdfnup_not_found_text="Software pdfnup not found! Please, install it."

	msg_pages_per_booklet_title="Document \"${file_name}\""
	msg_pages_per_booklet="Pages per booklet (suggest: $pages_per_booklet_hint, total pages: $original_total_pages)"
	msg_orientation_title="Orientation of document \"${file_name}\""
	msg_orientation_text="Select orientation of document \"${file_name}\""
	msg_orientation_left_to_right="The document is in left-to-right language"
	msg_orientation_right_to_left="The document is in right-to-left language (such as Arabic or Hebrew)"
	msg_one_file="Do you want all booklet in only one file?"
	msg_one_file_output_file_name="${base_file_name} (booklet)"
	msg_save_file_title="Save document"
	msg_progressbar_dialog_title="Document \"${file_name}\""
	msg_progressbar_dialog_text="Converting document \"${file_name}\" to booklet"
	msg_progressbar_dialog_text2="Converting pages ... "
	msg_progressbar_dialog_saving="Saving booklet N."
	msg_progressbar_dialog_saving2="Saving booklet ..."

	msg_finish_title="Conversion of document \"${file_name}\""
	msg_finish_ok="Done."
	msg_finish_error="An error has occurred."
	msg_file_not_found="File not found."
}

load_language_fr () {
	msg_alert_pdftk_not_found_title="Composant non trouvé"
	msg_alert_pdftk_not_found_text="Logiciel pdftk non trouvé! S'il vous plaît, installez-le."

	msg_alert_pdfnup_not_found_title="Composant non trouvé"
	msg_alert_pdfnup_not_found_text="Logiciel pdfnup non trouvé! S'il vous plaît, installez-le."

	msg_pages_per_booklet_title="Document \"${file_name}\""
	msg_pages_per_booklet="Pages par livret (suggère: $pages_per_booklet_hint, nombre total de pages: $original_total_pages)"
	msg_orientation_title="Orientation du document \"${file_name}\""
	msg_orientation_text="Choisissez l'orientation du document \"${file_name}\""
	msg_orientation_left_to_right="Ce document est dans une langue qui se lit de gauche à droite"
	msg_orientation_right_to_left="Ce document est dans une langue qui se lit de droite à gauche (comme l'arabe ou l'hébreu)"
	msg_one_file="Voulez-vous tous les livrets dans un seul fichier ?"
	msg_one_file_output_file_name="${base_file_name} (livret)"
	msg_save_file_title="Sauver le document"
	msg_progressbar_dialog_title="Document \"${file_name}\""
	msg_progressbar_dialog_text="Conversion du document \"${file_name}\" en livret"
	msg_progressbar_dialog_text2="Conversion des pages ... "
	msg_progressbar_dialog_saving="Enregistrement du livret N."
	msg_progressbar_dialog_saving2="Enregistrement du livret ..."

	msg_finish_title="Conversion du document \"${file_name}\""
	msg_finish_ok="Terminée."
	msg_finish_error="Une erreur est survenue."
	msg_file_not_found="Fichier non trouvé."
}

load_language_it () {
	msg_alert_pdftk_not_found_title="Componente non trovato"
	msg_alert_pdftk_not_found_text="Il software pdftk non è stato trovato! Per favore, installalo."

	msg_alert_pdfnup_not_found_title="Componente non trovato"
	msg_alert_pdfnup_not_found_text="Il software pdfnup non è stato trovato! Per favore, installalo."

	msg_pages_per_booklet_title="Documento \"${file_name}\""
	msg_pages_per_booklet="Pagine per opuscolo (suggerite: $pages_per_booklet_hint, pagine totali: $original_total_pages)"
	msg_orientation_title="Orientazione del documento \"${file_name}\""
	msg_orientation_text="Seleziona l'orientazione del documento \"${file_name}\""
	msg_orientation_left_to_right="Lingua da sinistra a destra (come inglese o italiano)"
	msg_orientation_right_to_left="Lingua da destra a sinistra (come arabo o ebraico)"
	msg_one_file="Vuoi salvare gli opuscoli in un solo file?"
	msg_one_file_output_file_name="${base_file_name} (opuscolo)"
	msg_save_file_title="Salva documento"
	msg_progressbar_dialog_title="Documento \"${file_name}\""
	msg_progressbar_dialog_text="Conversione del documento \"${file_name}\" in opuscolo"
	msg_progressbar_dialog_text2="Conversione delle pagine ..."
	msg_progressbar_dialog_saving="Salvataggio dell'opuscolo N."
	msg_progressbar_dialog_saving2="Salvataggio dell'opuscolo ..."

	msg_finish_title="Conversione del documento \"${file_name}\""
	msg_finish_ok="Completata."
	msg_finish_error="Si è verificato un errore."
	msg_file_not_found="File non trovato."
}

load_language_ru () {
	msg_alert_pdftk_not_found_title="Компонент не найден"
	msg_alert_pdftk_not_found_text="Программное обеспечение pdftk не найдено! Установите pdftk."

	msg_alert_pdfnup_not_found_title="Компонент не найден"
	msg_alert_pdfnup_not_found_text="Программное обеспечение pdfnup не найдено! Установите pdfnup."

	msg_pages_per_booklet_title="Документ \"${file_name}\""
	msg_pages_per_booklet="Страниц в буклете (Предлагаю: $pages_per_booklet_hint, Всего страниц: $original_total_pages)"
	msg_orientation_title="Orientation of document \"${file_name}\""
	msg_orientation_text="Выбор ориентации для документа \"${file_name}\""
	msg_orientation_left_to_right="Язык в документе слева на право"
	msg_orientation_right_to_left="Язык в документе справа на лево (такой как арабский или иврит)"
	msg_one_file="Вы хотите сделать весь буклет только в одном файле?"
	msg_one_file_output_file_name="${base_file_name} (буклет)"
	msg_save_file_title="Сохранить документ"
	msg_progressbar_dialog_title="Документ \"${file_name}\""
	msg_progressbar_dialog_text="Преобразование документа \"${file_name}\" в буклет"
	msg_progressbar_dialog_text2="Преобразование страниц ... "
	msg_progressbar_dialog_saving="Сохранение буклета N."
	msg_progressbar_dialog_saving2="Сохранение буклета ..."

	msg_finish_title="Преобразование документа \"${file_name}\""
	msg_finish_ok="Готово."
	msg_finish_error="Произошла ошибка."
	msg_file_not_found="Файл не найден."
}

load_language () {
	## Load localized strings AFTER english strings
	## - if localized strings not found use english for default
	## - if localized strings are incomplete use english only fot missing strings :-)
	load_language_en && [ "${lang}" != "en" ] && load_language_${lang}
}

lang=${LANGUAGE%%:*}
type load_language_${lang} > /dev/null || lang='en'
load_language

################################################

kdialog_bin=$(which kdialog)
[ -z "${kdialog_bin}" ] && echo "kdialog not found!" && exit 1

pdftk_bin=$(which pdftk)
[ -z "${pdftk_bin}" ] && "${kdialog_bin}" --title "${msg_alert_pdftk_not_found_title}" --icon configure --error "${msg_alert_pdftk_not_found_text}" && exit 2

pdfnup_bin=$(which pdfnup)
[ -z "${pdfnup_bin}" ] && "${kdialog_bin}" --title "${msg_alert_pdfnup_not_found_title}" --icon configure --error "${msg_alert_pdfnup_not_found_text}" && exit 2

################################################

convert () {
	while [ $# -ne 0 ]; do
		## Input files must have absolute path!
		work_dir="${1%/*}"; [ ! -d "${work_dir}" ] && work_dir="$(pwd)"
		file_name="${1##*/}"
		base_file_name="${file_name%.*}"

		original_total_pages=$(pdftk "${work_dir}/${file_name}" dump_data | grep "NumberOfPages" | cut -d" " -f 2-)
		[ $((original_total_pages % 4)) -eq 0 ] && [ ${original_total_pages} -le 20 ] && pages_per_booklet_hint=${original_total_pages} || pages_per_booklet_hint=20

		## Reload language strings with current variables
		load_language

		[ ! -f "${work_dir}/${file_name}" ] && shift && "${kdialog_bin}" --title "${msg_finish_title}" --passivepopup "${msg_file_not_found}" 5 && continue

		############################################################################################

		pages_per_booklet=$("${kdialog_bin}" --title "${msg_pages_per_booklet_title}" --icon configure --combobox "${msg_pages_per_booklet}" $(seq 4 4 $((original_total_pages*2+2))) --default $pages_per_booklet_hint) || exit
		[ "$pages_per_booklet" ] || pages_per_booklet=$pages_per_booklet_hint

		case "$("${kdialog_bin}" --title "${msg_orientation_title}" --icon format-text-direction-ltr --radiolist "${msg_orientation_text}" 1 "${msg_orientation_left_to_right}" on 0 "${msg_orientation_right_to_left}" off --geometry 350x150)" in
			0) rightToLeft="TRUE";;
			1) rightToLeft="FALSE";;
			*) exit 0;;
		esac

		## calculate empty pages to add and final total pages
		[ $original_total_pages -eq $pages_per_booklet ] && empty_pages_to_add=0 || empty_pages_to_add=$((pages_per_booklet - (original_total_pages % pages_per_booklet)))
		total_pages=$((original_total_pages + empty_pages_to_add))

		"${kdialog_bin}" --yesno "${msg_one_file}"
		case "$?" in
			0) one_file="TRUE";
				##output_file_name=$("${kdialog_bin}" --title "${msg_save_file_title}" --icon document-save --getsavefilename "${work_dir}/${msg_one_file_output_file_name}.pdf" application/pdf) || exit;;
				output_file_name="${work_dir}/${msg_one_file_output_file_name}.pdf";;
			1) one_file="FALSE";;
			*) exit 0;;
		esac

		n='0'; start_page='0'; string=''
		progressbar_dialog=$("${kdialog_bin}" -title "${msg_progressbar_dialog_title}" --icon kjournal --progressbar "${msg_progressbar_dialog_text}" $total_pages)
		##qdbus $progressbar_dialog org.kde.kdialog.ProgressDialog.showCancelButton true
		##until test "true" = $(qdbus $progressbar_dialog wasCancelled); do
			while [ "$(($start_page+$pages_per_booklet))" -le "$total_pages" ]; do
				a=$((start_page+1))
				b=$((start_page+pages_per_booklet))
				while [ "$a" -lt "$b" ]; do
					[ "$a" -gt "${original_total_pages}" ] && aa='{}' && aa1='{}' || { aa=$a; aa1=$((a+1)); }
					[ "$b" -gt "${original_total_pages}" ] && bb='{}' && bb1='{}' || { bb=$b; bb1=$((b-1)); }
					[ x"$rightToLeft" = x'FALSE' ] && string="${string},${bb},${aa},${aa1},${bb1}" || string="${string},${aa},${bb},${bb1},${aa1}"
					a=$((a+2))
					b=$((b-2))
					qdbus $progressbar_dialog org.kde.kdialog.ProgressDialog.setLabelText "${msg_progressbar_dialog_saving} $(($start_page+1))-$(($start_page+$pages_per_booklet))"
					qdbus $progressbar_dialog Set org.kde.kdialog.ProgressDialog value $a
				done

				if [ x"$one_file" = x'FALSE' ];
					then qdbus $progressbar_dialog org.kde.kdialog.ProgressDialog.setLabelText "${msg_progressbar_dialog_saving} ${n} ..."
						n=$((n+1))
						"${pdfnup_bin}" --outfile "${output_file_name}" -- "${work_dir}/${file_name}" "${string#,}"
						string=''
						sleep 1
				fi
				start_page=$(($start_page+$pages_per_booklet))
			done
			[ x"$one_file" = x'TRUE' ] && qdbus $progressbar_dialog org.kde.kdialog.ProgressDialog.setLabelText "${msg_progressbar_dialog_saving2}" && "${pdfnup_bin}" --outfile "${output_file_name}" -- "${file_name}" "${string#,}"
		##done
		qdbus $progressbar_dialog org.kde.kdialog.ProgressDialog.close
		"${kdialog_bin}" --title "${msg_finish_title}" --passivepopup "${msg_finish_ok}" 5 || \
		"${kdialog_bin}" --title "${msg_finish_title}" --passivepopup "${msg_finish_error}" 5

		############################################################################################

		shift
	done
}

#### main

convert "${@}" && exit 0
