#!/bin/bash

JUST_CLEAN=0
while getopts ":jh" opt
do
    case "$opt" in
        j)
            JUST_CLEAN=1
        ;;
        h)
            echo "Usage: $0 [-h] [-j]"
            echo "  -j    Just clean (do not upgrade)"
            echo "  -h    Show this message"
            exit 0
        ;;
    esac
done

ROOT_DIR=$( cd `dirname $0`; pwd )
LOCAL_SAV_DIR="$ROOT_DIR/config.local"

# Import config
if [ ! -f $LOCAL_SAV_DIR/local.sh ]
then
    echo "Error : You don't have create your own local.sh file in config.local directory. You could rely on the local.sh.example file to create your version."
    exit 1
fi

source $LOCAL_SAV_DIR/local.sh

function msg() {
    echo $2 "$1" | tee -a "$LOG_FILE"
}

function check_file_or_symlink() {
    [ -f "$1" ] && echo 0 && return 0
    if [ -L "$1" ]
    then
        [ -r "$1" ] && echo 0 && return 0
        rm -f "$1"
    fi
    echo 1 && return 1
}

cd $ROOT_DIR

msg "-> Store gettext MO files state : "
MO_STATE_BEFORE=$( find $ROOT_DIR/src/lang/ -type f -name '*.mo'|sort -u|xargs md5sum )
msg "done."

msg "-> Clean git repos : "
for i in $LOCAL_FILES
do
	msg "\t-> $i : " -en
	if [ -L $i ]
	then
        msg "\n\t\t-> Delete file : " -en
		rm -fr $i >> $LOG_FILE 2>&1
		if [ $? -gt 0 ]
		then
			msg "Error"
			exit 1
		else
			msg "Ok"
		fi
		if [ -f $i.sav ]
		then
    		msg "\t\t-> Restore orignal file : " -en
			mv $i.sav $i >> $LOG_FILE 2>&1
			if [ $? -gt 0 ]
	                then
        	                msg "Error"
				exit 1
	                else
        	                msg "Ok"
                	fi
		fi
	else
		msg "file does not exist, pass..."
	fi
done

if [ "$THEME" != "" ]
then
	msg "\t\t-> Remove theme : " -en
	rm -f $ROOT_DIR/src/templates/$THEME $ROOT_DIR/src/images/$THEME $ROOT_DIR/src/css/$THEME >> $LOG_FILE 2>&1
	if [ $? -gt 0 ]
	then
  	msg "Error"
    exit 1
  else
  	msg "Ok"
  fi
fi

msg "\t\t-> Clean template cache : " -en
rm -f $ROOT_DIR/src/tmp/*.tpl.php
if [ $? -gt 0 ]
then
	msg "Error"
	exit 1
else
	msg "Ok"
fi

msg "-> Verification of git repos state : "
git status >> $LOG_FILE 2>&1
if [ "$ETAT" != "" ]
then
	msg "\n\t-> [Error] Some changes have been made to source code since the last update." -e
	exit 1
fi
msg "\t->[OK]" -e

if [ $JUST_CLEAN -eq 1 ]
then
  msg "-> Just-clean mode : stop."
  exit 0
fi

msg "-> Store MD5 sum of the upgrade script to detect update on it :"
UPGRADE_SCRIPT_MD5=$( md5sum $0 )
msg "\t->[OK]" -e

msg "-> Upgrade git repos : "
RES_GIT=`git pull`
RES=$?
msg "$RES_GIT" -e
if [ $RES -gt 0 ]
then
	msg "\t-> [Error] Problem during git repos pull." -e
	exit 1
fi
msg "\t-> [OK]" -e

msg "-> Check change on upgrade script :"
if [ "$UPGRADE_SCRIPT_MD5" != "$( md5sum $0 )" ]
then
  msg "\t-> [WARNING] Changes detected on $0 script => Re-run it from start" -e
  $0 $@
  exit $?
else
  msg "\t-> [OK] No change detected on upgrade script." -e
fi

msg "-> Install local files : "
for i in $LOCAL_FILES
do
	msg "\t-> $i : " -ne
	SRC="$LOCAL_SAV_DIR/`basename $i`"
	if [ -f $SRC ]
	then
		msg
        if [ -f $ROOT_DIR/$i ]
		then
			msg "\t\t-> Backup original file : " -en
			mv $ROOT_DIR/$i $ROOT_DIR/$i.sav >> $LOG_FILE 2>&1
			if [ $? -gt 0 ]
			then
				msg "Error"
				exit 1
			fi
			msg "Ok"

			msg "\t\t-> Check possible change of the original file since last upgrade : " -en
			if [ -f $SRC.orig ]
			then
				DIFF=`diff $ROOT_DIR/$i.sav $SRC.orig`
				if [ "$DIFF" != "" ]
				then
				    msg "\n$DIFF\n\t\t\t-> Caution : This file changed. Do you want edit this file now ? [y/N] " -en
					read a
					echo "Reponse : $a"  >> $LOG_FILE
					if [ "$a" == "y" -o "$a" == "Y" ]
					then
						vi -d $SRC $ROOT_DIR/$i.sav
					fi
				else
					msg "No change"
				fi
			else
				msg "Original backup file does not exist. Pass ..."
			fi
			msg "\t\t-> Backup file for next upgrade : " -en
			cp -f $ROOT_DIR/$i.sav $SRC.orig >> $LOG_FILE 2>&1
			if [ $? -gt 0 ]
			then
				msg "Error"
                exit 1
			fi
			msg "Ok"
		fi
		msg "\t\t-> Install local file : " -en
		ln -s $SRC $ROOT_DIR/$i >> $LOG_FILE 2>&1
		if [ $? -gt 0 ]
		then
			msg "Error"
			exit 1
		fi
		msg "Ok"
	else
		msg "file does not exist. Pass..."
	fi
done

if [ "$THEME" != "" ]
then
	msg "-> Install theme : "

	# TPL
	msg "\t- Template : " -e
	ln -s $LOCAL_SAV_DIR/theme/templates $ROOT_DIR/src/templates/$THEME >> $LOG_FILE 2>&1
	if [ -d $ROOT_DIR/src/templates/$THEME_TPL_REF ]
	then
		msg "\t\t-> Vérification de la présence des fichiers : " -e
		for i in $ROOT_DIR/src/templates/$THEME_TPL_REF/*
		do
			f=`basename $i`
			msg "\t\t\t- $f : " -en
			if [ `check_file_or_symlink "$ROOT_DIR/src/templates/$THEME/$f"` -eq 0 ]
			then
				msg "present."
			else
				ln -s $ROOT_DIR/src/templates/$THEME_TPL_REF/$f $ROOT_DIR/src/templates/$THEME/$f
				msg "link."
			fi
		done
	fi

	# IMG
	msg "\t- Images : " -e
	ln -s $LOCAL_SAV_DIR/theme/images $ROOT_DIR/src/images/$THEME >> $LOG_FILE 2>&1
	if [ -d $ROOT_DIR/src/images/$THEME_IMG_REF ]
	then
		msg "\t\t-> Vérification de la présence des fichiers : " -e
		for i in $ROOT_DIR/src/images/$THEME_IMG_REF/*
		do
			f=`basename $i`
			msg "\t\t\t- $f : " -en
			if [ `check_file_or_symlink "$ROOT_DIR/src/images/$THEME/$f"` -eq 0 ]
			then
				msg "present."
			else
				ln -s $ROOT_DIR/src/images/$THEME_IMG_REF/$f $ROOT_DIR/src/images/$THEME/$f
				msg "link."
			fi
		done
	fi

	# CSS
	msg "\t- CSS : " -e
	ln -s $LOCAL_SAV_DIR/theme/css $ROOT_DIR/src/css/$THEME >> $LOG_FILE 2>&1
	if [ -d $ROOT_DIR/src/css/$THEME_CSS_REF ]
	then
		msg "\t\t-> Vérification de la présence des fichiers : " -e
		for i in $ROOT_DIR/src/css/$THEME_CSS_REF/*
		do
			f=`basename $i`
			msg "\t\t\t- $f : " -en
			if [ `check_file_or_symlink "$ROOT_DIR/src/css/$THEME/$f"` -eq 0 ]
			then
				msg "present."
			else
				ln -s $ROOT_DIR/src/css/$THEME_CSS_REF/$f $ROOT_DIR/src/css/$THEME/$f
				msg "link."
			fi
		done
	fi
fi

msg "-> Check for gettext MO files changes : "
MO_STATE_AFTER=$( find $ROOT_DIR/src/lang/ -type f -name '*.mo'|sort -u|xargs md5sum )
if [ "$MO_STATE_AFTER" == "$MO_STATE_BEFORE" ]
then
	msg "No change detected."
elif [ -n "$WEBSERVER_RELOAD_CMD" ]
then
	msg "Changed detected : try to webserver to handle changes..."
	$WEBSERVER_RELOAD_CMD
	if [ $? -eq 0 ]
	then
		msg "done."
	else
		msg "ERROR"
	fi
else
	msg "Changed detected :\n\n/!\\ You have to force-reload your webserver to handle it ! /!\\\n\n"
fi
