#! /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_pdftoppm_not_found_title="Komponente wurde nicht gefunden"
	msg_alert_pdftoppm_not_found_text="Die pdftoppm Software wurde nicht gefunden! Bitte installieren Sie pdftoppm."

	msg_insert_password_title="Passwort eingeben"
	msg_insert_password_usr="Bitte das Benutzerpasswort für \"${file_name}\" eingeben:"
	msg_insert_password_own="Bitte das Masterpasswort für \"${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 \"${file_name}\" angeben, der umgewandelt werden soll:"

	msg_options_title="Eigenschaften"
	msg_options="Optionen für die Umwandlung von \"${file_name}\" auswählen"

	msg_dpi_title="Auflösung, in DPI"
	msg_dpi="Umwandlung von \"${file_name}\". Auflösung in DPI festlegen (standard ist 150):"


	msg_options_color="Eine farbige PPM-Datei erstellen"
	msg_options_gray="Eine Graustufen-PGM-Datei erstellen"
	msg_options_mono="Eine s/w PBM-Datei erstellen"

	msg_images_root_name_title="Bilderpräfix eingeben"
	msg_images_root_name="Die Bilder werden nach einem Präfix (ohne Leerzeichen) gefolgt von einer Nummer benannt. (${file_name}-000.ppm, ${file_name}-001.ppm ...). Präfix ändern oder den Standardwert lassen:"

	msg_dest_dir="${base_file_name} (bilder)"
	msg_create_dir_error="Kann das Zielverzeichnis für die Bilddateien nicht erstellen!"

	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_pdftoppm_not_found_title="Component not found"
	msg_alert_pdftoppm_not_found_text="Software pdftoppm not found! Please, install it."

	msg_insert_password_title="Insert password"
	msg_insert_password_usr="Please insert user password of document \"${file_name}\":"
	msg_insert_password_own="Please insert main password of document \"${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 \"${file_name}\":"

	msg_dpi_title="Resolution, in DPI"
	msg_dpi="Conversion of \"${file_name}\". Set resolution in DPI (default is 150):"

	msg_options_title="Preferences"
	msg_options="Select options for conversion of \"${file_name}\""
	msg_options_color="generate a color PPM file"
	msg_options_gray="generate a grayscale PGM file"
	msg_options_mono="generate a monochrome PBM file"

	msg_images_root_name_title="Insert pictures prefix"
	msg_images_root_name="The images name will be made by a prefix (without spaces) followed by a progressive number (${file_name}-000.ppm, ${file_name}-001.ppm ...). Change prefix for images or leave default value:"

	msg_dest_dir="${base_file_name} (images)"
	msg_create_dir_error="Unable to create the images destination directory!"

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

	msg_insert_password_title="Saisissez le mot de passe"
	msg_insert_password_usr="Saisissez le mot de passe utilisateur pour \"${file_name}\":"
	msg_insert_password_own="Saisissez le mot de passe Administrateur pour \"${file_name}\":"

	msg_input_pages_range_title="Sélection de pages"
	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 \"${file_name}\" à convertir en images PPM:"

	msg_dpi_title="Résolution, en DPI"
	msg_dpi="Conversion de \"${file_name}\". Réglez la résolution en DPI (par défaut: 150):"

	msg_options_title="Préferences"
	msg_options="Sélectionnez les options de conversion pour \"${file_name}\""
	msg_options_color="générer un fichier PPM couleurs"
	msg_options_gray="générer un fichier PPM niveaux de gris"
	msg_options_mono="générer un fichier PPM noir et blanc"

	msg_images_root_name_title="Insérer un préfixe pour les images"
	msg_images_root_name="Notes: les noms des images seront faits d'un préfixe suivi d'un nombre progressif: (${file_name}-000.ppm, ${file_name}-001.ppm ...). Changez le préfixe pour les images ou gardez le préfixe par défaut:"

	msg_dest_dir="${base_file_name} (images)"
	msg_create_dir_error="Impossible de créer le repertoire de destination des images!"

	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_pdftoppm_not_found_title="Componente non trovato"
	msg_alert_pdftoppm_not_found_text="Il software pdftoppm non è stato trovato! Per favore, installalo."

	msg_insert_password_title="Inserisci password"
	msg_insert_password_usr="Per favore digita la password utente per \"${file_name}\":"
	msg_insert_password_own="Per favore digita la password principale per \"${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 convertire da \"${file_name}\":"

	msg_dpi_title="Risoluzione, in DPI"
	msg_dpi="Conversione di \"${file_name}\". Imposta la risoluzione in DPI (150 é il valore predefinito):"

	msg_options_title="Preferenze"
	msg_options="Seleziona le opzioni per la conversione di \"${file_name}\""
	msg_options_color="genera un file immagine PPM a colori"
	msg_options_gray="generate un file immagine PGM in scala di grigi"
	msg_options_mono="genera un file immagine PBM monocromatico"

	msg_images_root_name_title="Inserisci il prefisso per le immagini"
	msg_images_root_name="Il nome delle immagini, sará composto da un prefisso (senza spazi) seguito da un numero crescente (${file_name}-000.ppm, ${file_name}-001.ppm ...). Cambia il prefisso per le immagini o lascia il valore predefinito:"

	msg_dest_dir="${base_file_name} (immagini)"
	msg_create_dir_error="Non é possibile creare la directory di destinazione per le immagini!"

	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_pdftoppm_not_found_title="Компонент не найден"
	msg_alert_pdftoppm_not_found_text="Программное обеспечение pdftoppm не найдено! Установите pdftoppm."

	msg_insert_password_title="Вставить пароль"
	msg_insert_password_usr="Пожалуйста, вставьте пароль пользователя для документа \"${file_name}\":"
	msg_insert_password_own="Пожалуйста, вставьте основной пароль для документа \"${file_name}\":"

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

	msg_dpi_title="Разрешение в DPI"
	msg_dpi="Преобразование \"${file_name}\". Установить разрешение в DPI (по умолчанию 150):"

	msg_options_title="Параметры"
	msg_options="Выбор параметров для конвертации \"${file_name}\""
	msg_options_color="Генерировать цветной файл PPM"
	msg_options_gray="Генерировать файл серых оттенков PGM"
	msg_options_mono="Генерировать монохромный файл PBM"

	msg_images_root_name_title="Вставить префикс изображений"
	msg_images_root_name="Примечание: Названия изображений будут присваиваться с помощью префикса, за которым следуют числа в прогрессии (${file_name}-000.ppm, ${file_name}-001.ppm ...). Измените префикс для изображений или оставить значение по умолчанию:"

	msg_dest_dir="${base_file_name} (изображения)"
	msg_create_dir_error="Невозможно создать каталог назначения для изображений!"

	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

pdftoppm_bin=$(which pdftoppm)
[ -z "${pdftoppm_bin}" ] && "${kdialog_bin}" --title "${msg_alert_pdftoppm_not_found_title}" --icon configure --error "${msg_alert_pdftoppm_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 image --radiolist "${msg_options}" _color "${msg_options_color}" on _gray "${msg_options_gray}" off _mono "${msg_options_mono}" off --separate-output | sed 's/_color//' | sed 'y/_/-/')
	dpi=$("${kdialog_bin}" --title "${msg_dpi_title}" --icon configure --inputbox "${msg_dpi}" "300" | grep [0-9] | grep -v [^0-9] | sed 's/^/-r /')

	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

		mkdir -p "${msg_dest_dir}" || ( "${kdialog_bin}" --icon folder --error "${msg_create_dir_error}" && exit 3)

		images_root_name="img"
		#images_root_name=$("${kdialog_bin}" --title "${msg_images_root_name_title}" --icon edit-rename --inputbox "${msg_images_root_name}" "${base_file_name}")

		[ ! -f "${work_dir}/${file_name}" ] && shift && "${kdialog_bin}" --title "${msg_finish_title}" --passivepopup "${msg_file_not_found}" 5 && continue
		"${pdftoppm_bin}" ${password} ${options} ${dpi} ${range} "${work_dir}/${file_name}" "${msg_dest_dir}/${images_root_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}" "${@}" && exit 0
