#!/bin/sh

usage ()
{
	echo "$0 [<flora_export> [<result_dir>]]"
	echo "	<flora_export> = Exportarchiv oder ausgepackter Exportordner"
	echo "	<website_dir> = zu erzeugender Ordner mit der Website"
	exit
}
[ $# -ne 1 -o \( "$1" != "-h" -a "$1" != "--help" \) ] || usage
[ $# -le 2 ] || usage

warn ()
{
	echo "$1" >/dev/stderr
}
die ()
{
	echo "$1" >/dev/stderr
	exit 1
}
extract_zip ()
{
	# expects FLORA_EXPORT is set
	# sets FLORA_EXPORT_DIR
	FLORA_EXPORT_DIR=`basename $FLORA_EXPORT .zip`
	mkdir $FLORA_EXPORT_DIR || exit 1
	( cd $FLORA_EXPORT_DIR && unzip ../$FLORA_EXPORT ) || exit 2
}

MY_FLORA_SITE="website"
if [ -n "$1" ]
then	FLORA_EXPORT=$1
	if [ -e $FLORA_EXPORT ]
	then	if [ -d $FLORA_EXPORT ]
		then	FLORA_DIR=$FLORA_EXPORT
		else	extract_zip
			case $0 in
			1)	die "Not extracting $FLORA_EXPORT because $FLORA_EXPORT_DIR already exists."
				;;
			2)	die "Failed to extract $FLORA_EXPORT"
				;;
			esac
			FLORA_DIR=$FLORA_EXPORT_DIR
		fi
	else	die "Flora Incognita export does not exist: $FLORA_EXPORT"
	fi
else	FLORA_EXPORT=`sh -c "ls -t flora_incognita_20??-??-??T??_??_??.zip" | head -1`
	FLORA_EXPORT_DIR=`basename $FLORA_EXPORT .zip`
	FLORA_NEWEST=`sh -c "ls -dt flora_incognita_20??-??-??T??_??_??" | head -1`
	if [ -z "$FLORA_EXPORT" ]
	then	warn  "No Flora Incognita export file found."
		[ -z "$FLORA_NEWEST" ] || die "No Flora Incognita export directory found."
		warn  "Using $FLORA_NEWEST."
		FLORA_DIR=$FLORA_NEWEST
	else	if [ -z "$FLORA_NEWEST" ] || [ "$FLORA_EXPORT_DIR" \> "$FLORA_NEWEST" ]
		then 	case `extract_zip` in
			1)	die "Not extracting $FLORA_EXPORT because $FLORA_EXPORT_DIR already exists."
				;;
			2)	die "Failed to extract $FLORA_EXPORT"
				;;
			esac
			FLORA_DIR=$FLORA_EXPORT_DIR
		else	FLORA_DIR=$FLORA_NEWEST
		fi
	fi
fi
if [ -n "$2" ]
then RESULT_DIR=$2
else RESULT_DIR=$MY_FLORA_SITE
fi

SRC_DIR=`dirname $0`
PROG_NAME=`basename $0 .sh`
PROG_SCRIPT=$PROG_NAME.sh
PROG_AWK=$PROG_NAME.awk
PROG_AWK_UTIL=util
PROG_AWK_COMMON=util/common.awk
PROG_AWK_CSV=util/dequote-csv.awk
CSS=$PROG_NAME.css
CSS_DIR=css
CONFIG=config
INDEX_HEAD=index.html.head
INDEX_TAIL=index.html.tail
SRC_DOC=src.html
SRC_FILES="$PROG_SCRIPT $PROG_AWK $PROG_AWK_UTIL $CONFIG $CSS $INDEX_HEAD $INDEX_TAIL $SRC_DOC"
SRC_PATHS=
for f in $SRC_FILES
do
	SRC_PATHS="$SRC_PATHS $SRC_DIR/$f"
done

[ -n "$FLORA_DIR" ] || usage
[ -e "$FLORA_DIR" ] || die "$FLORA_DIR does not exist."
[ -d "$FLORA_DIR" ] || { ls -l "$FLORA_DIR" ; die "$FLORA_DIR ist not a directory." ; }

CSV_FILE="$FLORA_DIR/$FLORA_DIR.csv"
[ -e "$CSV_FILE" ] || die "CSV file $CSV_FILE does not exist."
[ -f "$CSV_FILE" ] || { ls -l "$CSV_FILE" ; die "File $CSV_FILE is not a file." ; }

#FIELDS_FILE="/tmp/fields_file.$$"
#head -1 "$CSV_FILE" | cut -b 4- | tr -d '\r' | tr "," "\n" > $FIELDS_FILE
#awk '{ ++l ; field[$0] = l } END { print field["scientific name"] }' $FIELDS_FILE

UUIDs=`sed -E -n -e 's/^"([0-9a-f-]{36})".*$/\1/p' $CSV_FILE | sort -u`
[ -n UUIDs ] || die "No UUID (project id) found in $CSV_FILE"
UUID_COUNT=`echo $UUIDs | wc -w`
if [ $UUID_COUNT -eq 1 ]
then	MY_FLORA_ID=$UUIDs
else	MY_FLORA_ID=`echo $UUIDs | tr " " "\n" | head -1`
	warn "Number of different UUIDs (project ids) in $CSV_FILE is not 1, but $UUID_COUNT.\n\
	Using $MY_FLORA_ID."
fi

LOCAL_DIR=local
OBSOLETE_LIST=$LOCAL_DIR/obsolete-files.list
OBSOLETE_SCRIPT=$LOCAL_DIR/obsolete-files.tmp.sh
rm -f $OBSOLETE_SCRIPT
if [ -s $OBSOLETE_LIST ]
then
	{ echo "echo Deleting the files in $OBSOLETE_LIST ..." ;
	  sed -E -n -e 's%^(.+)$%rm -v "'$RESULT_DIR'/\1"%p' $OBSOLETE_LIST ;
	  echo "echo ... done."
	} > $OBSOLETE_SCRIPT
	chmod +x $OBSOLETE_SCRIPT
	# wird dann vom awk script aufgerufen
fi

MODIFICATIONS_INFILE=$LOCAL_DIR/modifications.tag-columns.csv
MODIFICATIONS_AWK=$LOCAL_DIR/tag-columns2tags-string.awk
MODIFICATIONS_OUTFILE=$LOCAL_DIR/modifications.csv
if [ -r $MODIFICATIONS_AWK -a -r $MODIFICATIONS_INFILE ]
then	if [ ! -e $MODIFICATIONS_OUTFILE -o \
		$MODIFICATIONS_OUTFILE -ot $MODIFICATIONS_INFILE -o \
		$MODIFICATIONS_OUTFILE -ot $MODIFICATIONS_AWK ]
	then	# XXX , statt ; und --csv versuchen
		awk -F\; -v OFS=, -f $MODIFICATIONS_AWK \
			$MODIFICATIONS_INFILE > $MODIFICATIONS_OUTFILE
	fi
fi

AWK_OPTS="--csv -f $SRC_DIR/$PROG_AWK_COMMON"
awk $AWK_OPTS || AWK_OPTS="-F, -f $SRC_DIR/$PROG_AWK_COMMON -f $SRC_DIR/$PROG_AWK_CSV"
cat $CSV_FILE | tr -d "\\r" | \
awk $AWK_OPTS \
	-v MY_FLORA_ID=$MY_FLORA_ID \
	-v IN_DIR=$FLORA_DIR \
	-v OUT_DIR=$RESULT_DIR \
	-v OBSOLETE_SCRIPT=$OBSOLETE_SCRIPT \
	-f $SRC_DIR/$PROG_AWK

if [ -r $LOCAL_DIR/$CONFIG ]
then config=$LOCAL_DIR/$CONFIG
else config=$SRC_DIR/$CONFIG
fi
if [ -r $LOCAL_DIR/$INDEX_HEAD ]
then index_head=$LOCAL_DIR/$INDEX_HEAD
else index_head=$SRC_DIR/$INDEX_HEAD
fi
if [ -r $LOCAL_DIR/$INDEX_TAIL ]
then index_tail=$LOCAL_DIR/$INDEX_TAIL
else index_tail=$SRC_DIR/$INDEX_TAIL
fi
if [ -r $LOCAL_DIR/$CSS ]
then css=$LOCAL_DIR/$CSS
else css=$SRC_DIR/$CSS
fi

mv $RESULT_DIR/index.html $RESULT_DIR/index.table.html
cat $index_head $RESULT_DIR/index.table.html $index_tail \
    > $RESULT_DIR/index.html
if [ -r $config ]
then	sed -E -e 's/^([^[:space:]]+)[[:space:]]+(.*)/s@%%\1%%@\2@g/' $config | \
	if sed --version 2>/dev/null | fgrep -q GNU
	then sed -f - -i $RESULT_DIR/index.html
	else sed -f - -i "" $RESULT_DIR/index.html
	fi
fi

mkdir $RESULT_DIR/$CSS_DIR
cp -p $css $RESULT_DIR/$CSS_DIR

mkdir $RESULT_DIR/$SRC_DIR
cp -a $SRC_PATHS $RESULT_DIR/$SRC_DIR
tar cvJf $RESULT_DIR/$SRC_DIR/$PROG_NAME.txz $SRC_PATHS
zip $RESULT_DIR/$SRC_DIR/$PROG_NAME.zip $SRC_PATHS

for script in local/execute-*.sh
do
	if [ -x $script ]
	then	echo Executing $script ...
		if $script $RESULT_DIR
		then echo ... done.
		else echo ... failed.
		fi
	else	echo "Ignoring $script because it ist not executable."
	fi
done

# XXX
# Feld "scientific name" als Index und Name für das Unterverzeichnis nehmen.
# Dieses Unterverzeichnis anlegen,
# zugehörige Bilder hineinlinken (mglw. aus verschiedenen Quellverzeichnissen
# 	wg. mehrfach auftretendem "scientific name"),
# dort auch index.html mit Liste der Bilder (Galerie?) generieren,
# schließlich im Wurzelverzeichnis als index.html
#	die Liste/Tabelle der "scientific name"s
#		samt "name" und "tags" (und "notes"?)
# 		mit link zu dem jeweiligen Unterverzeichnis
#			(ggf. sortiert nach "tags")
