#! /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_pdfimages_not_found_title="Komponente wurde nicht gefunden"
	msg_alert_pdfimages_not_found_text="Die pdfimages Software wurde nicht gefunden! Bitte installieren Sie pdfimages."

	msg_insert_password_title="Passwort eingeben"
	msg_insert_password_usr="Bitte das Benutzerpasswort für  \"${file_name}\" eingeben:"
	msg_insert_password_own="Bitte das Besitzerpasswort für  \"${file_name}\" eingeben:"

	msg_input_pages_range_title="Seitenbereich"
	msg_input_pages_range="Hinweis: Mit dem Wort \"end\" kann die letzte Seite des Dokuments angegeben werden. Bitte die Seiten angeben, von denen die Bilder extrahiert werden sollen:"

	msg_dest_dir="${file_name} (extrahierte Bilder)"
	msg_create_dir_error="Zielverzeichnis kann nicht erstellt werden!"

	msg_finish_title="Extraktionsbilder aus Dokument \"${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_pdfimages_not_found_title="Component not found"
	msg_alert_pdfimages_not_found_text="Software pdfimages 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 of \"${file_name}\" to extract images:"

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

	msg_finish_title="Extraction images from 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_pdfimages_not_found_title="Composant non trouvé"
	msg_alert_pdfimages_not_found_text="Logiciel pdfimages 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 de \"${file_name}\":"
	msg_insert_password_own="Saisissez le mot de passe Administrateur de \"${file_name}\":"

	msg_input_pages_range_title="Sélectionnez les 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}\" desquelles les images seront extraites:"

	msg_dest_dir="${file_name} (images extraites)"
	msg_create_dir_error="Impossible de créer le dossier de destination des images !"

	msg_finish_title="Images d'extraction 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_pdfimages_not_found_title="Componente non trovato"
	msg_alert_pdfimages_not_found_text="Il software pdfimages non è stato trovato! Per favore, installalo."

	msg_insert_password_title="Inserisci Password"
	msg_insert_password_usr="Per favore digita la password utente di \"${file_name}\":"
	msg_insert_password_own="Per favore digita la password principale di \"${file_name}\":"

	msg_input_pages_range_title="Seleziona range:"
	msg_input_pages_range="Note: 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 di \"${file_name}\" da cui estrarre le immagini:"

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

	msg_finish_title="Estrazione delle immagini dal 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_gs_not_found_title="Компонент не найден"
	msg_alert_gs_not_found_text="Программное обеспечение gs не найдено! Установите Ghostscript."

	msg_alert_pdfimages_not_found_title="Компонент не найден"
	msg_alert_pdfimages_not_found_text="Программное обеспечение pdfimages не найдено! Установите pdfimages."

	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_images_root_name_title="Префикс входящих изображений"
	msg_images_root_name="Примечание: При извлечении изображений из документа названия будут присваиваться с помощью префикса, за которым следуют числа в прогрессии: (${file_name}-000.ppm, ${file_name}-001.ppm ...). Измените префикс для изображений или оставить значение по умолчанию:"

	msg_dest_dir="${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

pdfimages_bin=$(which pdfimages)
[ -z "${pdfimages_bin}" ] && "${kdialog_bin}" --title "${msg_alert_pdfimages_not_found_title}" --icon configure --error "${msg_alert_pdfimages_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
}

selectedpages () {
	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_own}") || 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

	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
		"${pdfimages_bin}" -p -j ${range} ${password} "${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
