#!/usr/bin/env bash

[[ $# -ne 1 ]] && echo "Usage: ./sync.sh /path/to/folder" && exit 1

# Redirect stdout ( > ) into a named pipe ( >() ) running "tee"
exec > >(tee "$1"/logfile)

# Also redirect stderr
exec 2>&1

# 9 min delay between resync
FREQUENCY=540

TIDYUP="$(pwd)/tidyup.sh"
RSYNC="$(pwd)/upload.sh"

DEFAULT="\033[00m"
RED="\033[01;31m"
BLUE="\033[01;36m"

function info() {
    echo -en "$BLUE"; echo -n $1; echo -e "$DEFAULT"
}
function error() {
    echo -en "$RED"; echo -n $1; echo -e "$DEFAULT"
}

function syncdir() {
    EXIT=1
    i=1
#    while [ $EXIT -ne 0 ]; do
        info "Trying to sync $1; $2; $3"
        "$RSYNC" $1 $2 $3
        EXIT=$?
        [ $EXIT -ne 0 ] && error "sync failed"
        let i++
#    done 
    return $EXIT
}

# Sort files
# Mask 
function tidyup() {
    info "sorting $1"
    "$TIDYUP" $1
    if [ "$?" -ne 0 ]; then
        error "sorting failed, please send logfile.txt to toxygen1@gmail.com"
        return 1
    fi
    return 0
}

# Test public key authentication
function sshtest() {
    ./test.sh
    if [ "$?" -eq 0 ]; then
        info "Authentication works"
        return 0
    else
        error "Authentication does not work"
        return 1
    fi
}

# Check if we can connect, otherwise terminate
sshtest || exit 1

# Change working directory
cd $1

# first sort
tidyup $1 || error "Sort failed, please analyze logfile.txt ."
    
# first sync 
info "Doing complete sync"
syncdir . -a

    if [ -f "$1"/LAST ]
    then
      read LAST < "$1"/LAST
    else
      LAST="."
    fi

    if [ -f "$1"/capture/LAST ]
    then
      read LAST_HOUR < "$1"/capture/LAST
    else
      LAST_HOUR="."
    fi


# Periodically tidy up and do incremental sync
while :
do
    # start timer
    start_time=`date +%s`
    
    OLD="$LAST"
    OLD_HOUR="$LAST_HOUR"
    # sort
    tidyup $1 || error "Sort failed, please analyze logfile.txt ."
    
    
    if [ -f "$1"/LAST ]
    then
    
      # read last processed day
      read LAST < "$1"/LAST
      read LAST_HOUR < "$1"/capture/LAST
  
      # sync last updated folders  
      syncdir audio/"$LAST" -a
      syncdir capture/"$LAST_HOUR" -a
      syncdir data/"$LAST" -a
      syncdir data --dirs --delete 
  
      # days changed, sync whole yesterday too
      if [ "$LAST" != "$OLD" ]
      then 
        info "syncing yesterday"
        syncdir audio/"$OLD" -a
        syncdir capture/"$OLD" -a
        syncdir data/"$OLD" -a
      else
        # hours changed, sync previous hour too
        if [ "$LAST_HOUR" != "$OLD_HOUR" ]
        then 
          info "syncing previous hour"
          syncdir capture/"$OLD_HOUR" -a
        fi
      fi
    fi
    
    # end timer
    end_time=`date +%s`
    ELAPSED=`expr $end_time - $start_time`
    info "execution time was $ELAPSED s"  
    date
    
    # save only tail from logfile
    tail -n 1000 "$1"/logfile > "$1"/logfile.txt
    rm "$1"/logfile
    syncdir . --dirs --delete > /dev/null 2>&1
    exec > >(tee "$1"/logfile)
    exec 2>&1

    # wait for a next syncing period
    sleep $FREQUENCY
done