#! /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##*/} pages files"
	echo
	echo "pages:\t\tallpages, selectpages"
	echo "files:\t\tfile1 file2 ..."
	echo
	echo "example:\t${0##*/} allpages /home/user/file1.pdf /home/user/file2.pdf"
	echo
	exit 0
fi

action="${1}"
shift

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

load_language_de () {
	msg_alert_gs_not_found_title="Komponente wurde nicht gefunden"
	msg_alert_gs_not_found_text="Die gs Software wurde nicht gefunden! Bitte installieren Sie Ghostscript."

	msg_alert_pdftops_not_found_title="Komponente wurde nicht gefunden"
	msg_alert_pdftops_not_found_text="Die pdftops Software wurde nicht gefunden! Bitte installieren Sie pdftops"

	msg_insert_passwd_title="Passwort eingeben"
	msg_insert_passwd_usr="Bitte das Benutzerpasswort für \"${base_file_name}\" eingeben:"
	msg_insert_passwd_own="Bitte das Masterpasswort für \"${base_file_name}\" eingeben:"

	msg_input_pages_range_title="Seitenbereich eingeben"
	msg_input_pages_range="Beachte: Das Schlüsselwort \"end\" kann für die letzte Seite benutzt werden, anstatt deren Seitenzahl anzugeben. Bitte Seitenbereich von \"${base_file_name}\" angeben, der umgewandelt werden soll:"

	msg_options_title="Eigenschaften"
	msg_options="Optionen für die Umwandlung von \"${base_file_name}\" auswählen"
	msg_options_1="Type 1 Schriften nicht einbetten"
	msg_options_2="TrueType Schriften nicht einbetten"
	msg_options_3="CID PostScript Schriften nicht einbetten"
	msg_options_4="CID TrueType Schriften nicht einbetten"
	msg_options_5="Seiten ggf. auf Papiergröße vergrößern"
	msg_options_6="Seiten nicht verkleinern, die größer als das Papier sind"
	msg_options_7="Seiten nicht zentrieren, die kleiner als das Papier sind"
	msg_options_8="Duplex Druck ermöglichen"

	msg_level_options_title="Postscript Level"
	msg_level_options="PostScript Level auswählen, der erzeugt werden soll"
	msg_level_options_1="Level 1 PostScript"
	msg_level_options_2="Level 2 PostScript (standard)"
	msg_level_options_3="Level 3 PostScript"
	msg_level_options_1sep="Level 1 teilbares PostScript"
	msg_level_options_2sep="Level 2 teilbares PostScript"
	msg_level_options_3sep="Level 3 teilbares PostScript"

	msg_alert_overwrite_title="Alles überschreiben?"
	msg_alert_overwrite_text="Eine oder mehrere Zieldateien existieren! Alles überschreiben?"
	msg_save_file_title="Dokument speichern"

	msg_finish_title="Konvertierung des Dokuments \"${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_gs_not_found_title="Component not found"
	msg_alert_gs_not_found_text="Software gs not found! Please, install Ghostscript."

	msg_alert_pdftops_not_found_title="Component not found"
	msg_alert_pdftops_not_found_text="Software pdftops not found! Please, install it."

	msg_insert_passwd_title="Insert password"
	msg_insert_passwd_usr="Please insert user password of document \"${base_file_name}\":"
	msg_insert_passwd_own="Please insert main password of document \"${base_file_name}\":"

	msg_input_pages_range_title="Input pages range"
	msg_input_pages_range="Notes: The keyword \"end\" may be used to reference the final page of a document instead of a page number. Please input page range to convert from \"${base_file_name}\":"

	msg_options_title="Preferences"
	msg_options="Select options for conversion of \"${base_file_name}\""
	msg_options_1="Don't embed Type 1 fonts"
	msg_options_2="Don't embed TrueType fonts"
	msg_options_3="Don't embed CID PostScript fonts"
	msg_options_4="Don't embed CID TrueType fonts"
	msg_options_5="Expand pages smaller than the paper size"
	msg_options_6="Don't shrink pages larger than the paper size"
	msg_options_7="Don't center pages smaller than the paper size"
	msg_options_8="Enable duplex printing"

	msg_level_options_title="Postscript level"
	msg_level_options="Select PostScript level to generate"
	msg_level_options_1="Level 1 PostScript"
	msg_level_options_2="Level 2 PostScript (default)"
	msg_level_options_3="Level 3 PostScript"
	msg_level_options_1sep="Level 1 separable PostScript"
	msg_level_options_2sep="Level 2 separable PostScript"
	msg_level_options_3sep="Level 3 separable PostScript"

	msg_alert_overwrite_title="Overwrite all?"
	msg_alert_overwrite_text="One or more destination files exist! Overwrite all?"
	msg_save_file_title="Save document"

	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_gs_not_found_title="Composant non trouvé"
	msg_alert_gs_not_found_text="Logiciel Ghostscript non trouvé! S'il vous plaît, installez-le."

	msg_alert_pdftops_not_found_title="Composant non trouvé"
	msg_alert_pdftops_not_found_text="Logiciel pdftops non trouvé! S'il vous plaît, installez-le."

	msg_insert_passwd_title="Saisissez le mot de passe"
	msg_insert_passwd_usr="Saisissez le mot de passe utilisateur pour \"${base_file_name}\":"
	msg_insert_passwd_own="Saisissez le mot de passe Administrateur pour \"${base_file_name}\":"

	msg_input_pages_range_title="Sélection de pages"
	#msg_input_pages_range="Notes: The keyword \"end\" may be used to reference the final page of a document instead of a page number.\n\nPlease input page range to convert from \"${base_file_name}\":"
	msg_input_pages_range="Notes: Le mot \"end\" peut être utilisé pour désigner la dernière page.
Pour désigner toute une plage de pages, inscrivez le numéro de la première et de la dernière page de cette plage séparés par un \"-\".
Pour désigner une page isolée inscrivez son numéro séparé par un espace.
Pour désigner une seule page, entrez seulement le numéro de cette page.

  Ex:
    de la page 4 à la dernière page:
      4-end
    la page 2, de la page 4 à la page 7, et la page 9:
      2 4-7 9
    seulement la page 3:
      3

Saisissez les pages de \"${base_file_name}\" à convertir en PostScript:"
	msg_options_title="Préferences"
	msg_options="Sélectionnez les options de conversion pour \"${base_file_name}\""
	msg_options_1="Ne pas incorporer les polices Type 1"
	msg_options_2="Ne pas incorporer les polices TrueType"
	msg_options_3="Ne pas incorporer les polices CID PostScript"
	msg_options_4="Ne pas incorporer les polices CID TrueType"
	msg_options_5="Développer des pages plus petites que la taille du papier"
	msg_options_6="Ne pas réduire les pages plus grandes que le format de papier"
	msg_options_7="Ne pas centrer les pages plus petites que la taille du papier"
	msg_options_8="Activer l'impression recto verso"

	msg_level_options_title="Niveau du Postscript"
	msg_level_options="Sélectionnez le niveau du PostScript à générer"
	msg_level_options_1="PostScript Niveau 1"
	msg_level_options_2="PostScript Niveau 2 (par défaut)"
	msg_level_options_3="PostScript Niveau 3"
	msg_level_options_1sep="PostScript Niveau 1 séparable"
	msg_level_options_2sep="PostScript Niveau 2 séparable"
	msg_level_options_3sep="PostScript Niveau 3 séparable"

	msg_alert_overwrite_title="Tout écraser?"
	msg_alert_overwrite_text="Un ou plusieurs fichiers de destination existe! Tout écraser?"
	msg_save_file_title="Sauver le document"

	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_gs_not_found_title="Componente non trovato"
	msg_alert_gs_not_found_text="Il software gs non è stato trovato! Per favore installa Ghostscript."

	msg_alert_pdftops_not_found_title="Componente non trovato"
	msg_alert_pdftops_not_found_text="Il software pdftops non è stato trovato! Per favore, installalo."

	msg_insert_passwd_title="Inserisci password"
	msg_insert_passwd_usr="Per favore digita la password utente per \"${base_file_name}\":"
	msg_insert_passwd_own="Per favore digita la password principale \"${base_file_name}\":"

	msg_input_pages_range_title="Selezione range"
	msg_input_pages_range="Nota: La parola chiave \"end\" può essere usata per indicare la pagina finale di un documento al posto di un valore numerico. Per favore inserisci il range di pagine da estrarre da \"${base_file_name}\":"

	msg_options_title="Preferenze"
	msg_options="Seleziona le opzioni per la conversione di \"${base_file_name}\""
	msg_options_1="Non incorporare i caratteri Type 1"
	msg_options_2="Non incorporare i caratteri TrueType"
	msg_options_3="Non incorporare i caratteri CID PostScript"
	msg_options_4="Non incorporare i caratteri CID TrueType"
	msg_options_5="Espandi le pagine piccole"
	msg_options_6="Non ridurre le pagine grandi"
	msg_options_7="Non centrare le pagine piccole"
	msg_options_8="Abilita stampa duplex"

	msg_level_options_title="Livello Postscript"
	msg_level_options="Seleziona il livello PostScript da generare"
	msg_level_options_1="PostScript livello 1"
	msg_level_options_2="PostScript livello 2 (predefinito)"
	msg_level_options_3="PostScript livello 3"
	msg_level_options_1sep="PostScript livello 1 separabile"
	msg_level_options_2sep="PostScript livello 2 separabile"
	msg_level_options_3sep="PostScript livello 3 separabile"

	msg_alert_overwrite_title="Sovrascrivi tutti?"
	msg_alert_overwrite_text="Uno o più file destinazione esistono già! Sovrascriverli tutti?"
	msg_save_file_title="Salva documento"

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

load_language_ru () {
	msg_alert_gs_not_found_title="Компонент не найден"
	msg_alert_gs_not_found_text="Программное обеспечение gs не найдено! Установите Ghostscript."

	msg_alert_pdftops_not_found_title="Компонент не найден"
	msg_alert_pdftops_not_found_text="Программное обеспечение pdftops не найдено! Установите pdftops."

	msg_insert_passwd_title="Вставить пароль"
	msg_insert_passwd_usr="Пожалуйста, вставьте пароль пользователя для документа \"${base_file_name}\":"
	msg_insert_passwd_own="Пожалуйста, вставьте основной пароль для документа \"${base_file_name}\":"

	msg_input_pages_range_title="Диапазон входящих страниц"
	msg_input_pages_range="Примечание: Ключевое слово \"end\" может использоваться, чтобы сослаться на заключительную страницу документа вместо номера страницы. Пожалуйста, вставьте диапазон страниц для преобразования из \"${base_file_name}\":"

	msg_options_title="Параметры"
	msg_options="Выбор параметров для конвертации \"${base_file_name}\""
	msg_options_1="Не вставлять шрифты Type 1"
	msg_options_2="Не вставлять шрифты TrueType"
	msg_options_3="Не вставлять шрифты CID PostScript"
	msg_options_4="Не вставлять шрифты CID TrueType"
	msg_options_5="Расширить страницы размера меньше бумаги"
	msg_options_6="Не сжимать страницы размер которых превышает размер бумаги"
	msg_options_7="Не центрировать страницы размера меньше бумаги"
	msg_options_8="Включить двустороннюю печать"

	msg_level_options_title="Уровень Postscript"
	msg_level_options="Выбрать уровень для генерации PostScript"
	msg_level_options_1="Уровень 1 PostScript"
	msg_level_options_2="Уровень 2 PostScript (по умолчанию)"
	msg_level_options_3="Уровень 3 PostScript"
	msg_level_options_1sep="Уровень 1 PostScript сепарабельный"
	msg_level_options_2sep="Уровень 2 PostScript сепарабельный"
	msg_level_options_3sep="Уровень 3 PostScript сепарабельный"

	msg_alert_overwrite_title="Перезаписать все?"
	msg_alert_overwrite_text="Один или несколько файлов назначения существуют! Перезаписать все?"
	msg_save_file_title="Сохранить документ"

	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

gs_bin=$(which gs)
[ -z "${gs_bin}" ] && "${kdialog_bin}" --title "${msg_alert_gs_not_found_title}" --icon configure --error "${msg_alert_gs_not_found_text}" && exit 2

pdftops_bin=$(which pdftops)
[ -z "${pdftops_bin}" ] && "${kdialog_bin}" --title "${msg_alert_pdftops_not_found_title}" --icon configure --error "${msg_alert_pdftops_not_found_text}" && exit 2

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

checkIfProtected () {
	output=$("${gs_bin}" -dBATCH -sNODISPLAY "${1}" 2>&1)
	gsexit=$?

	if [ "$gsexit" = "0" ]; then
		is_protected=0;
	else
		found=$(echo "$output" | grep -o "This file requires a password")
		if [ -n "$found" ]; then
			is_protected=1;
		else
			"${kdialog_bin}" --title "${msg_finish_title}" --passivepopup "${msg_finish_error}" 5
			exit $gsexit
		fi
	fi
}

selectpages () {
	checkIfProtected $1

	if [ ${is_protected} = 1 ]; then
		password=$("${kdialog_bin}" --title "${msg_insert_password_title}" --password "${msg_insert_password_usr}") || exit 0
		password=$(echo ${password} |grep '^.' |sed 's/^/-upw /')

		if [ -z "${password}" ]; then
			password=$("${kdialog_bin}" --title "${msg_insert_password_title}" --password "${msg_insert_password_usr}") || exit 0
			password=$(echo ${password} |grep '^.' |sed 's/^/-opw /')
		fi

		[ -z "${password}" ] && password=''
	fi

	if [ -z "${range}" ]; then
		range=$("${kdialog_bin}" --title "${msg_input_pages_range_title}" --icon edit-copy --inputbox "${msg_input_pages_range}" "1-end") || exit 0
		range=$(echo "${range}" | sed 's/[[:blank:]]*//g' | sed 's/-end//' | sed 's/\(^[0-9][0-9]*\)/-f \1/' | sed 's/\(^-f [0-9][0-9]*\)-\([0-9][0-9]*\)/\1 -l \2/'| sed 's/^-\([0-9][0-9]*\)/-l \1/')
	else
		range=''
	fi

	options=$("${kdialog_bin}" --title "${msg_options_title}" --icon configure --checklist "${msg_options}" _noembt1 "${msg_options_1}" off _noembtt "${msg_options_2}" off _noembcidps "${msg_options_3}" off _noembcidtt "${msg_options_4}" off _expand "${msg_options_5}" on _noshrink "${msg_options_6}" off _nocenter "${msg_options_7}" off _duplex "${msg_options_8}" off --separate-output) || exit 0
	options=$(echo ${options} | sed 'y/_/-/')

	level_options=$("${kdialog_bin}" --title "${msg_level_options_title}" --icon configure --radiolist "${msg_level_options}" _level1 "${msg_level_options_1}" off _level2 "${msg_level_options_2}" on _level3 "${msg_level_options_3}" off _level1sep "${msg_level_options_1sep}" off _level2sep "${msg_level_options_2sep}" off _level3sep "${msg_level_options_3sep}" off --separate-output) || exit 0
	level_options=$(echo ${level_options} | sed 'y/_/-/')

	if [ $# -gt 1 ]; then
		multi_selection="true"
	else
		unset multi_selection
	fi

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

		## Reload language strings with current variables
		load_language

		output_file_name="${work_dir}/${base_file_name}.ps"
		#output_file_name=$("${kdialog_bin}" --title "${msg_save_file_title}" --icon document-save --getsavefilename "${work_dir}/${base_file_name}.ps" application/postscript) || exit 0
		if [ -e "${output_file_name}" ]; then
			if [ "$multi_selection" ]; then			# if you selected multiple files
				if [ ! "${overwrite_all}" ]; then		# if ${overwrite_all} is unset
					"${kdialog_bin}" --title "${msg_alert_overwrite_title}" --icon document-save-all --yesnocancel "${msg_alert_overwrite_text}"
					case "$?" in
						0)	overwrite_all="true";;		# click on Yes
						1)	overwrite_all="false";;		# click on No
						2)	exit 0;;					# click on Cancel
						esac
				fi
				if [ "${overwrite_all}" = "false" ]; then
					output_file_name=$("${kdialog_bin}" --title "${msg_save_file_title}" --icon document-save --getsavefilename "${output_file_name}" application/postscript) || exit 0
				fi
			else
				output_file_name=$("${kdialog_bin}" --title "${msg_save_file_title}" --icon document-save --getsavefilename "${output_file_name}" application/postscript) || exit 0
			fi
		fi

		[ ! -f "${work_dir}/${file_name}" ] && shift && "${kdialog_bin}" --title "${msg_finish_title}" --passivepopup "${msg_file_not_found}" 5 && continue
		"${pdftops_bin}" ${level_options} ${options} ${password} ${range} "${work_dir}/${file_name}" "${output_file_name}" && \
		"${kdialog_bin}" --title "${msg_finish_title}" --passivepopup "${msg_finish_ok}" 5 || \
		"${kdialog_bin}" --title "${msg_finish_title}" --passivepopup "${msg_finish_error}" 5

		shift
	done
}

allpages () {
	range='all'
	selectpages "${@}"
}

#### main

"${action}" "${@}"
