#!/bin/bash
log="echo -e"

CURRENT_BRANCH=$(git --git-dir=/home/pi/PlanktoScope/.git rev-parse --abbrev-ref HEAD)
REMOTE_BRANCHES=$(git --git-dir=/home/pi/PlanktoScope/.git branch --remotes --list | awk '/HEAD/{next;} split($1, a, "/") {print a[2]}')
if [[ $# == 1 ]]; then
    if [[ $REMOTE_BRANCHES =~ (^|[[:space:]])$1($|[[:space:]]) ]]; then
        BRANCH="$1"
    else
        BRANCH="$CURRENT_BRANCH"
    fi
else
    BRANCH="$CURRENT_BRANCH"
fi

${log} "Updating the main repository to branch $BRANCH"

function restart(){
    sudo nginx -t && sudo systemctl reload nginx
    sudo systemctl restart nodered.service
}

function update(){
    cd /home/pi/PlanktoScope || { echo "/home/pi/PlanktoScope does not exist"; exit 1; }
    sudo killall -15 raspimjpeg
    sudo killall -15 python3
    git stash
    # TODO detect branch change and use git pull on same branch and checkout on diff branch
    if [[ "$CURRENT_BRANCH" == "$BRANCH" ]]; then
        git pull
    else
        git checkout --force "$BRANCH"
    fi
    git checkout stash@'{0}' -- config.json hardware.json
    # TODO we need to change this to drop stash@{1} if changes made to the flow are to be restored by the user
    git stash drop
}

function special_before(){
    cd /home/pi/.node-red || { echo "/home/pi/.node-red does not exist"; exit 1; }
    sudo rpi-eeprom-update -a
    ${log} "Nothing else special to do before updating!"
}

function special_after(){
    cd /home/pi/.node-red || { echo "/home/pi/.node-red does not exist"; exit 1; }
    #node_modules/copy-dependencies/index.js projects/PlanktoScope ./
    # updating and installing now whatever module has been added to package.json
    #npm update
    #pip3 install -U -r /home/pi/PlanktoScope/requirements.txt
    ${log} "Nothing else special to do after updating!"
}

echo -e "\n\n\nUpdate on $(date)\n\n" >> /home/pi/update.log
cd /home/pi/PlanktoScope || { echo "/home/pi/PlanktoScope does not exist"; exit 1; }
remote=$(git ls-remote -h origin "$BRANCH" | awk '{print $1}')
local=$(git rev-parse HEAD)
if [[ "$local" == "$remote" ]]; then
    ${log} "Nothing to do!"
else
    ${log} "Local and Remote are different, we have to update, starting now... Please Wait."
    special_before &>> /home/pi/update.log
    ${log} "Everything is ready, doing the actual update now!"
    update &>> /home/pi/update.log
    #special_after &>> /home/pi/update.log
    ${log} "Update is complete, let's restart now."
    restart &>> /home/pi/update.log
fi
${log} "Update done!"