#!/bin/bash

#set -x

function ext {
	if ls "${arg1}" >/dev/null ;then
		rm "${arg1}" 2>> log || echo -e "\nimpossibile rimuovere ${arg1}. controlla i log."
	fi

	if ls ./temp/ >/dev/null ;then
		rm -r ./temp/ 2>> log || echo -e "\nimpossibile rimuovere la cartella \"temp\". controlla i log."
	fi

	if ls "${arg1}_orig" >/dev/null ;then
		mv "${arg1}_orig" "${arg1}" 2>> log || echo -e "\nimpossibile rinominare il file con il nome originale."
	fi

	exit 1
}

function CUT {
	w=$(($(pdfinfo ${arg1} | grep "Page size" | awk '{print $5}' | cut -d "." -f 1) / 28)) || exit 1
	h=$(($(pdfinfo ${arg1} | grep "Page size" | awk '{print $3}' | cut -d "." -f 1) / 28)) || exit 1
	if [ $w -gt $h ]; then 
		pdfjam -o "${arg1%.pdf}dx.pdf" --clip true --trim "$(($w / 2))cm 0cm 0cm 0cm" "$arg1" >>log 2>&1 || exit 1
		pdfjam -o "${arg1%.pdf}sx.pdf" --clip true --trim "0cm 0cm $(($w / 2))cm 0cm" "$arg1" >>log 2>&1 || exit 1
		array[0]="pdfjam -o $arg1 "
		for ((i=1; i<=$(pdfinfo "$arg1" | grep Pages | awk '{ print $NF }'); i++)); do
			array[$i]="${arg1%.pdf}sx.pdf $i ${arg1%.pdf}dx.pdf $i"
		done
		$(${array[*]} >>log 2>&1 || exit 1)
	elif [ $w -lt $h ]; then
		pdfjam -o "${arg1%.pdf}dx.pdf" --landscape --clip true --trim "0cm $(($h / 2)) 0cm 0cm" "$arg1" >>log 2>&1 || exit 1
		pdfjam -o "${arg1%.pdf}sx.pdf" --landscape --clip true --trim "0cm 0cm 0cm $(($h / 2))" "$arg1" >>log 2>&1 || exit 1
		array[0]="pdfjam -o $arg1 "
		for ((i=1; i<=$(pdfinfo "$arg1" | grep Pages | awk '{ print $NF }'); i++)); do
			array[$i]="${arg1%.pdf}sx.pdf $i ${arg1%.pdf}dx.pdf $i"
		done
		$(${array[*]} >>log 2>&1 || exit 1)
	else
		echo "la pagina è un cazzo di quadrato!"
		exit 1
	fi
	#rm "${arg1%.pdf}dx.pdf" "${arg1%.pdf}sx.pdf" || true
}

# controlla che si stia lavorando all'interno della cartella "typoshell".
clear
echo -e "\n--> controllo la pwd..." ; sleep 0.5
if ! pwd | grep -q "typoshell$"; then
	echo -e "\nERRORE: devi lanciare lo script dall'interno della cartella typoshell"
	ext
fi
echo -e "* ok!\n" ; sleep 0.5

# se non viene specificato nessun argomento esci, altrimenti assegna il primo argomento alla variabile "arg1".
clear
echo -e "\n--> controllo l'argomento e i tool necessari..." ; sleep 0.5
if ! [ $# == 1 ];then
	echo -e "\nERRORE: devi specificare un solo argomento!"
	ext
else
	# controlla la presenza del tool "detox".
	if ! which detox >/dev/null ;then
		echo -e "\nERRORE: non c'è detox."
		ext
	fi
	cp "${1}" . >> log 2>&1 || true
	if ls "${1}" | grep -qv "/" ;then # se il file originale è nella cartella typoshell crea una copia.
		cp "${1}" "$(basename "${1}")_orig" >> log 2>&1
	fi
	arg1=`detox -v "$(basename "${1}")" | tail -n 1 | awk 'BEGIN { FS = " " } { print $NF }'` # sanifica il nome del file
	if ! ls "${arg1}" | grep -iq "pdf$" ;then
		mv "${arg1}" "${arg1}.pdf"
		arg1="${arg1}.pdf"
	fi
fi

# controlla la presenza dei programmi necessari
if ! file -b "${arg1}" | grep -q "PDF" ;then
	echo -e "\nERRORE: il file non è un pdf"
	ext
fi

if ! which pdfinfo >/dev/null ;then
	echo -e "\nERRORE: non c'è pdfinfo"
	ext
fi

if ! dpkg -l | grep -q "groff ";then
	echo -e "\nERRORE: non c'è groff"
	ext
fi

if ! which pdfjam >/dev/null ;then
	echo -e "\nERRORE: non c'è pdfjam"
	ext
fi

if ! which pdfbook2 >/dev/null ;then
	echo -e "\nERRORE: non c'è pdfbook2"
	ext
fi

echo -e "* ok!\n" ; sleep 0.5

# crea la cartella temp.
clear
echo -e "\n--> creo una cartella temporanea..." ; sleep 0.5
if ! mkdir temp; then 
	echo -e "\nERRORE: esiste già una cartella temp oppure non hai i permessi per lavorare in questa cartella."
	ext
fi

echo -e "* ok!\n" ; sleep 0.5

# creo un file di log
clear
echo -e "\n--> creazione di un file di log..." ; sleep 0.5
rm -f log 
touch log || echo -e "\nimpossibile creare il file di log"
echo -e "* ok!\n" ; sleep 0.5

# richiede se sia necessario il cut delle pagine
clear
echo -e "\nè necessario dividere le singole pagine in due[s/N]?"
read flag_cut

# richiede l'inserimento del numero di pagine per fascicolo.
clear
echo -e "\nquante pagine per fascicolo?[40] "
read fasc

# richiede se si desidera mantenere i file dei fascicoli separati o meno. 
clear
echo -e "\nmantengo i fascicoli in file separati? [S/n] "
read flag

# se non viene inserito nessun valore imposta il valore di default [40]. 
if [ -z $fasc ] || (($(($fasc % 4)) > 0)) || $(echo $fasc | grep -qv [0-9]); then
	echo -e "+++ dimensione del fascicolo non specificata o dimensione non valida (deve essere un multiplo di 4!). uso il valore di default (40).\n"
	fasc=40
else
	echo -e "* ok! numero di pagine per fascicolo: $fasc \n" ; sleep 0.5
fi

# imposta l'offset nella forma 'xcm ycm zcm kcm' rispettivamente sinistra, basso, destra, alto.
clear
echo -e "\nimposta i margini da tagliare(sinistra, basso, destra, alto)['0cm 0cm 0cm 0cm'] (scrivi solo un numero omettendo \"cm\"):"
echo -e "\nmargine sinistro[0cm]: "
read trim[0]
if [ -z ${trim[0]} ] || echo ${trim[0]} | grep -vq "^[0-9]\{1,2\}\(\.[0-9]\{1\}\)\?$" ;then
       echo -e "valore omesso o non valido. uso il default: 0cm."	
       trim[0]=0
fi
echo -e "\nmargine basso[0cm]: "
read trim[1]
if [ -z ${trim[1]} ] || echo ${trim[1]} | grep -vq "^[0-9]\{1,2\}\(\.[0-9]\{1\}\)\?$" ;then
       echo -e "valore omesso o non valido. uso il default: 0cm."	
       trim[1]=0
fi
echo -e "\nmargine destro[0cm]: "
read trim[2]
if [ -z ${trim[2]} ] || echo ${trim[2]} | grep -vq "^[0-9]\{1,2\}\(\.[0-9]\{1\}\)\?$" ;then
       echo -e "valore omesso o non valido. uso il default: 0cm."	
       trim[2]=0
fi
echo -e "\nmargine alto[0cm]: "
read trim[3]
if [ -z ${trim[3]} ] || echo ${trim[3]} | grep -vq "^[0-9]\{1,2\}\(\.[0-9]\{1\}\)\?$" ;then
       echo -e "valore omesso o non valido. uso il default: 0cm."	
       trim[3]=0
fi
sleep 1
clear
echo -e "\nle pagine di $arg1 saranno tagliate secondo lo schema ${trim[*]} (cm sinistra, cm basso, cm destra, cm alto). ok?[S/n]"
read cut_ask
case $cut_ask in
	"n"|"N"|"no"|"NO")
		echo -e "\nesco dal programma..."
		ext
		;;
esac

# scegliere se si desidera omettere alcune pagine.
k=0
while true; do
	clear
	echo -e "\nvuoi escludere alcune pagine dal file?[s/N]"
	read exclude
	case $exclude in
		"yes"|"y"|"Y"|"YES"|"S"|"s"|"SI"|"si")
			echo -e "\nspecifica solo le pagine da *mantenere* nella forma \"<pag iniziale>-<pag finale>\":"
			read offset[${k}]
			k+=1
			;;
		*)
			break
			;;
	esac
done

# conferma dell'offset scelto
clear
if [ -z ${offset[0]} ] ;then
	echo -e "\nhai scelto di mantenere le seguenti pagine: tutte. ok?[S/n]"
else
	echo -e "\nhai scelto di mantenere le seguenti pagine: ${offset[@]}. ok?[S/n]"
fi
read confirm

case $confirm in
	"n"|"N"|"no"|"NO")
		clear
		echo -e "\nesco dal programma..."
		ext
		;;
esac


if ! [ -z "${offset[0]}" ]; then
	clear
	echo -e "\n--> seleziono le pagine da mantenere: ${offset[@]}..." ; sleep 0.5
	if ! pdfjam -o "./${arg1}" ${arg1} $(echo ${offset[@]} | sed "s/ /,/g") 2>> log ;then
		echo -e "\nerrore nell'escludere le pagine dal file"
		ext
	fi
	echo -e "* ok!\n" ; sleep 0.5
fi

case $flag_cut in
	"y"|"Y"|"yes"|"YES"|"Yes"|"s"|"si"|"SI"|"Si"|"S")
		clear
		echo -e "\n sto dividendo le pagine..."
		if ! CUT ;then
			clear
			echo -e "\nERRORE nel dividere le pagine"
			ext
		fi
		;;
esac

# numero di pagine del file pdf.
pages=$(pdfinfo $arg1 | grep Pages | cut -d " " -f 11)

# crea una pagina bianca come modello per aggiungere eventuali pagine bianche in coda al file.
clear
echo -e "\n--> creo un modello di pagina bianca per completare all'occorrenza l'ultimo fascicolo..." ; sleep 0.5
if ! echo "" | groff -T pdf > ./temp/blank.pdf; then
	echo -e "\nERRORE: nel creare il modello di pagina bianca"
	ext
fi

echo -e "* ok!\n" ; sleep 0.5

clear
echo -e "\n--> preparazione alla divisione in fascicoli..." ; sleep 0.5
for ((i=1, o=0; i<=$pages; i+=${fasc}, o+=1));do # $i: scorre il numero di pagine $fasc per volta; $o scorre l'indice dell'array $a.
	if [ $((${i} + ${fasc})) -gt $pages ];then # se $(($i + $fasc)) è maggiore del numero di pagine del pdf vuol dire che siamo all'ultimo fascicolo.
		a[${o}]="${i}-$pages" # aggiunge le indicazioni dell'ultimo fascicolo all'array $a. 
		for ((x=$(($(($i + $((${fasc} - 1)))) - $pages)); x>0; x--));do # reimposta un ciclo a partire dal valore dell'indice dell'array $a raggiunto nel ciclo superiore; 
			a[${o}]+=" ./temp/blank.pdf" # appende all'ultimo indice di $a l'indicazione di una pagina bianca tante volte quante sono le pagine che mancano dal numero di pagine del pdf al temine dell'ultimo fascicolo.
		done
	else
		a[${o}]="${i}-$((${i} + $((${fasc} - 1))))" # crea un array $a con le indicazioni delle pagine di ogni fascicolo nella forma "inizio-fine".
	fi
done

echo -e "* ok!\n" ; sleep 0.5

for ((i=0, n=1; i<${#a[*]}; i++, n++));do # per ogni voce dell'array $a (numero di fascicoli):
	clear
	echo -e "\n--> divisione in fascicoli...($n)" ; sleep 0.5
	if ! pdfjam -o "./temp/temp.pdf" --trim "${trim[0]}cm ${trim[1]}cm ${trim[2]}cm ${trim[3]}cm" --clip true $arg1 ${a[${i}]} 2>>log; then # crea un fascicolo.
		echo -e "\nERRORE: nel creare il fascicolo $n"
		ext
	fi
	echo -e "* ok!\n" ; sleep 0.5
	clear
	echo -e "\n--> impaginazione dei fascicoli...($n)" ; sleep 0.5
	#if ! pdfbook -q -o "./temp/${arg1%.pdf}$(printf "%02d" ${n}).pdf" "./temp/temp.pdf" 2>>log; then # impagina il fascicolo.
	if ! pdfbook2 "./temp/temp.pdf" > /dev/null 2>>log; then # impagina il fascicolo.
		echo -e "\nERRORE: nell'impaginare il fascicolo($n)"
		ext
	else
		mv "./temp/temp-book.pdf" "./temp/${arg1%.pdf}$(printf "%02d" ${n}).pdf"
	fi
	echo -e "* ok!\n" ; sleep 0.5
	clear
	echo -e "\n--> rimozione del file temporaneo...($n)" ; sleep 0.5
	rm "./temp/temp.pdf" || echo -e "\nERRORE: nel rimuovere il file temporaneo($n). proseguo comunque." # rimuove il file temporaneo risultante dal comando pdfjam.
	echo -e "* ok!\n" ; sleep 0.5
done

# rimuove il modello di pagina bianca.
clear
echo -e "\n--> rimozione del modello di pagina bianca..." ; sleep 0.5
rm "./temp/blank.pdf" || echo -e "\nERRORE: nel rimuovere il modello di pagina bianca. proseguo comunque."
echo -e "* ok!\n" ; sleep 0.5


# se si desidera un file unico unisce i fascicoli.
case $flag in 
	"no"|"n"|"N"|"No")
		clear
		echo -e "\n--> unisco i fascicoli in un file unico..."
		if ! pdfunite ./temp/* "${arg1%.pdf}_typo.pdf" ;then
			echo -e "\nERRORE: nell'unire i fascicoli. controllare la cartella temp."
			exit 1
		fi
		echo -e "* ok!\n" ; sleep 0.5
		clear
		echo -e "\n--> rimuovo il file originale..." ; sleep 0.5
		rm ${arg1} || echo -e "\nERRORE: imossibile rimuovere il file originale. proseguo comunque."
		echo -e "* ok!\n" ; sleep 0.5
		clear
		echo -e "\n--> rimuovo la cartella temporanea..." ; sleep 0.5
		rm -r "./temp" || echo -e "\nERRORE: impossibile rimuovere la cartella temporanea. proseguo comunque."
		echo -e "* ok!\n" ; sleep 0.5
		clear
		echo -e "\nSuccess. il tuo file è \"${arg1%.pdf}_typo.pdf\"" 
		exit 0
		;;
esac

clear
echo -e "\n--> rimuovo il file originale..." ; sleep 0.5
rm ${arg1} || echo -e "\nERRORE: imossibile rimuovere il file originale. proseguo comunque."
echo -e "* ok!\n" ; sleep 0.5
clear
echo -e "\n--> rinomino la cartella definitiva..."

if ! mv -T ./temp ${arg1%.pdf}_def >> log 2>&1 ;then
	rm -r "${arg1%.pdf}_def" && mv -T ./temp ${arg1%.pdf}_def
fi

echo -e "\nSuccess. i tuoi file sono nella cartella ${arg1%.pdf}_def\n" 
