#!/bin/sh
# proj1a
#
trap uklid INT HUP TERM
#trap-zachytava signal ; INT==SIGINT zn. ctrl+c ; HUP==SIGHUP ; SIGTERM==TERM zn. signal ukonceni

Ooption=false
Loption=false
Coption=false
Poption=false
Roption=false
Oarg=""
Parg=""

#$@ obsahuje vsechny argumenty
#if [ $? != 0 ] ; then echo "Chybne zadane parametry" ; exit 1 ; fi 
#$?  – obsahuje navratovy kod posledniho procesu spusteneho na popredi
#os=`uname -a | cut -d ' ' -f 1` #zjisti OS


#--------------------------FUNKCE--------------------------:

napoveda(){ #vypis napovedy
echo "ardiff vypisuje zmeny archivu, vytvari rozdilovy archiv nebo aplikuje rozdilovy
archiv na zdrojovy archiv.
Pouziti: ardiff [volby] archiv1 archiv2
Volby:
   -o SOUBOR  Pokud je cilem skriptu vytvorit archiv,
	      bude vytvoren do souboru se jmenem SOUBOR (plati pro -c a -p).
   -l         Vypis seznamu souboru, ktere se v zadanych archivech lisi.
   -c         Vytvoreni rozdiloveho archivu.
   -p         Aplikace rozdiloveho archivu (argument archiv2) na zdrojovy archiv
	      (argument archiv1).
   -r         Prepnuti do reverzniho rezimu (plati pro -p)."
}


zjisti_soubor(){ #funkce zjisti typ souboru, $1 protože se jedna o volanou funkci
	#echo "male pismena:"
	echo "$1" | tr [:upper:] [:lower:] >souboor
	typ_souboru=`file "$1" | awk '{print $2}'` #vybere pouze druhe slovo
return 0
}

rozbal(){ #pracujeme pouze s $1
typ_souboru=""
rozbaleno_bzip2=false
rozbaleno_zip=false
rozbaleno_gzip=false

	zjisti_soubor "$1" #volani funkce, predavame argument $1, protoze nam ho posunul shift
	
	if [ "$typ_souboru" = gzip ];then
		#echo "GZIP"
		
		rozbaleno_gzip=true

	elif [ "$typ_souboru" = Zip ];then #otestovat zda nevadi velke pismeno!
		#echo "ZIP"
		
		rozbaleno_zip=true
	
	elif [ "$typ_souboru" = bzip2 ];then
		#echo "BZIP2"
		
		rozbaleno_bzip2=true
	else echo "Jeden ze souboru se nepovedlo otevrit" 2>/tmp/tmp_ardiff_$$/stderr

	fi	

	if [ $pruchod = "prodolarjedna" ];then #pro $1

		vytvor_slozku /tmp/tmp_ardiff_$$/a

		if $rozbaleno_gzip;then
			#prejmenuj /a/ na /a/
			tar -xf "$1" -C /tmp/tmp_ardiff_$$/a

			if [ $? -ne 0 ];then
				echo "Nepovedl se rozbalit archiv "$1"" 2>/tmp/tmp_ardiff_$$/stderr
				exit 1	
			fi
		elif $rozbaleno_zip;then
			#prejmenuj /b/ na /a/
			unzip "$1" -d /tmp/tmp_ardiff_$$/a 2>&1 > /dev/null

			if [ $? -ne 0 ];then
				echo "Nepovedl se rozbalit archiv $1" 2>/tmp/tmp_ardiff_$$/stderr
				exit 1	
			fi
		elif $rozbaleno_bzip2;then
			#prejmenuj /c/ na /a/
			tar -xf "$1" -C /tmp/tmp_ardiff_$$/a

			if [ $? -ne 0 ];then
				echo "Nepovedl se rozbalit archiv $1" 2>/tmp/tmp_ardiff_$$/stderr
				exit 1	
			fi
		fi

	elif [ $pruchod = "prodolardva" ];then #pro $2

		vytvor_slozku /tmp/tmp_ardiff_$$/b

		if $rozbaleno_gzip;then
			tar -xf "$1" -C /tmp/tmp_ardiff_$$/b

			if [ $? -ne 0 ];then
				echo "Nepovedl se rozbalit archiv "$1"" 2>/tmp/tmp_ardiff_$$/stderr
				exit 1	
			fi
		elif $rozbaleno_zip;then
			#prejmenuj /b/ na /b/
			unzip "$1" -d /tmp/tmp_ardiff_$$/b 2>&1 > /dev/null

			if [ $? -ne 0 ];then
				echo "Nepovedl se rozbalit archiv $1" 2>/tmp/tmp_ardiff_$$/stderr
				exit 1	
			fi
		elif $rozbaleno_bzip2;then
			#prejmenuj /c/ na /b/
			tar -xf "$1" -C /tmp/tmp_ardiff_$$/b

			if [ $? -ne 0 ];then
				echo "Nepovedl se rozbalit archiv $1" 2>/tmp/tmp_ardiff_$$/stderr
				exit 1	
			fi
		fi

	fi

pruchod=prodolardva
return 0
}

seznam_souboru_ktere_se_lisi(){


	pruchod=prodolarjedna
	rozbal "$1"
	rozbal "$2"

		cd /tmp/tmp_ardiff_$$/
		find a -type f > adresarovy_list #zjistime strom souboru
		find b -type f >> adresarovy_list 
		cut -c 3- adresarovy_list >adresarovy_list_new
		sort -uo "adresarovy_list_new" "adresarovy_list_new"
		cat adresarovy_list_new | #cat slouzi pro spojeni souboru
		while read radek; do
			cmp -s "a/$radek" "b/$radek" 2>/dev/null  || echo "$radek" #||==ne0
		done

return 0
}


vytvor_slozku(){
	mkdir "$1"

	if [ $? -ne 0 ];then
	echo "Nepovedla se vytvorit slozka $1" 2>/tmp/tmp_ardiff_$$/stderr
	exit 1
	fi
return 0
}

uklid(){
	rm -r /tmp/tmp_ardiff_$$
exit 0
}

vycisti_prazdne_adresare(){ #zbavi adresar od prazdnych slozek

	cesta=/tmp/tmp_ardiff_$$
	find $cesta/dif -empty -type d >$cesta/cistka
	pocet_radku_v_souboru=`wc -l <$cesta/cistka`
	echo "Pocet radku v souboru je: "$pocet_radku_v_souboru

	if [ $pocet_radku_v_souboru != 0 ];then

		cat $cesta/cistka | #cat-vypsani souboru
		while read radek_delete;do
			rm -r $radek_delete
			echo "vymazal jsem: $radek_delete" 
		done
		vycisti_prazdne_adresare
	fi

return 0
}


#--------------------------PROGRAM--------------------------:

while getopts 'lcpo:' options; do
	case $options in

		l) Loption=true;;

		c) Coption=true;;

		p) Poption=true
		   Parg=$OPTARG;;

		r) Roption=true;;

		o) Ooption=true
		   Oarg=$OPTARG;;

		*) echo "napoveda 1"
		   napoveda
		   exit 0;;
	esac
done

echo "-------------------------------------------------------
rozbaleno_bzip2: $rozbaleno_bzip2
rozbaleno_zip: $rozbaleno_zip
rozbaleno_gzip: $rozbaleno_gzip
Ooption: $Ooption
Loption: $Loption
Coption: $Coption
Poption: $Poption
Roption: $Roption
Oarg: $Oarg
Parg: $Parg
-------------------------------------------------------"

shift $((OPTIND-1))

if [ $# -ne 2 ];then #pokud jsme zadali != 2 soubory
	echo "napoveda 2"
	napoveda
	exit 1
elif [ $Loption = false -a $Coption = false -a $Poption = false ];then #pokud jsme nezadali ani jeden z argumentu
	echo "napoveda 3"
	napoveda
	exit 1
fi


#-------------------------- -l--------------------------
#Vypis seznamu souboru, ktere se v zadanych archivech lisi-->
if $Loption; then

	vytvor_slozku /tmp/tmp_ardiff_$$
	seznam_souboru_ktere_se_lisi $1 $2

#-------------------------- -c--------------------------
#Vytvoreni rozdiloveho archivu-->
elif $Coption; then

#POZNAMKY- nepise spravnou cestu v souboru README, ani v souborech ve slozce README, vytvari v diffu prazdne slozky

	#echo "Rozdilovy soubor bude vytvoren pro $Oarg"

	#vytvor_slozku /home/tomas/Dokumenty/project/test

	cesta=/tmp/tmp_ardiff_$$/
	vytvor_slozku $cesta
	seznam_souboru_ktere_se_lisi $1 $2 >${cesta}/vystup_z_l
	cd ${cesta}
	vytvor_slozku ${cesta}/dif

	find a -type d > ${cesta}/adresarovy_list #zjistime strom adresaru prepinac -d
	find b -type d >> ${cesta}/adresarovy_list		
	cd ${cesta}
	cut -c 3- adresarovy_list > adresarovy_list_new #oklesti na relativni cestu
	sort -uo "adresarovy_list_new" "adresarovy_list_new" #seradi a odstrani duplikovane cesty
	cat adresarovy_list_new | #cat-vypsani souboru
	while read radek_file_list; do #radek po radku posilame do promenne
	#vytvarime adresarovou strukturu
		mkdir ${cesta}/dif/"$radek_file_list" 2>/dev/null 
	done
	
	cd ${cesta}
	cat vystup_z_l |
	while read radek_vystup_z_l; do #radek po radku posilame do promenne
	#porovnavame diffem

		if [ -f $cesta/a/$radek_vystup_z_l -a -f $cesta/b/$radek_vystup_z_l ];then
			echo "OBA EXISTUJI"
			diff -aurN a/$radek_vystup_z_l b/$radek_vystup_z_l > dif/$radek_vystup_z_l.patch 
		
		elif [ -f $cesta/a/$radek_vystup_z_l -a ! -f $cesta/b/$radek_vystup_z_l ];then
			#chybi druhy radek
			echo "JEDEN CHYBI"
			diff -aurN a/$radek_vystup_z_l "" | sed -r '2 s#(^[+][+][+][ ])#\1'b/$radek_vystup_z_l'#' > dif/$radek_vystup_z_l.patch

		elif [ ! -f $cesta/a/$radek_vystup_z_l -a -f $cesta/b/$radek_vystup_z_l ];then
			#chybi prvni radek
			echo "JEDEN CHYBI"
			diff -aurN "" b/$radek_vystup_z_l | sed -r '1 s#(^[-][-][-][ ])#\1'a/$radek_vystup_z_l'#' > dif/$radek_vystup_z_l.patch
		fi

	done
	vycisti_prazdne_adresare

fi
#
#uklid
echo "$tmp_ardiff_$$"
read -n 1
exit 0
