#!/bin/bash
# @author 6543
# @version 0.1
# @date 2019-02-07

## Options/Parameter
# [$1]: <path to movie folder>

{ #set enviroemnt
  readonly TRUE=1      #like <stdbool.h>
  readonly FALSE=0     #like <stdbool.h>
  readonly TTSYNC_EXIST=0       #file exist local
  readonly TTSYNC_BACKUP=1      #file exist local - backup exist
  readonly TTSYNC_REMOTE=2      #file exists remote - not used jet
  readonly TTSYNC_DEL=3         #local file deleted
  readonly globalconf="/etc/tt/global"
}

{ #get options & args
  readonly mode=$(echo $1 | tr -d '-')
  moviedir="$1"
  [ -z "$moviedir" ] && [ -f "$globalconf" ] && {					# if (no argument) and (globalconf exist)
    if [ -z "$(grep "moviedir=" "$globalconf" )" ]; then			# and (moviedir is NOT in globalconf)
      echo 'neither "movie folder" is set in global config nor given as argument'
      exit 2
    else															# and (moviedir is in globalconf)
      moviedir="$(grep "moviedir=" "$globalconf" | cut -d '=' -f 2)"
    fi
  }
  [ -d "$moviedir" ] || { echo "moviedir \"$moviedir\" do not exist"; exit 3; } # check moviedir
  moviedir=""$(echo $moviedir | sed 's|/$||g')""
  [ -z "$moviedir" ] && exit 255 #catch case moviedir="/"
  readonly DATE=$(date '+%Y-%m-%d')
}

{ #db
  dbname="tt_test"
  dbhost="localhost"
  dbuser="root"
  dbpwd=""
}

function help() {
  #help menue
  echo "$0 is part of the TerabyteTerminator Project"
  echo ""
  echo "update-file-state [moviedir]"
  echo "  moviedir: Is optional if it is already in the global config"

  exit 0
}
[ "$mode" == "help" ] && help

###########################
## Programm Haupt Ablauf ##
###########################
function main() {
  #cd to moviedir
  cd "$moviedir"

  #clean DB from old stuff
  {
    db_query "DELETE From File WHERE Size=0;"
  }

  #erselle zwei dateilisten
  list_tmp=$(mktemp -d)
  db_query "SELECT CONCAT('$moviedir/', Folder, '/', Name) FROM File WHERE TTSync=$TTSYNC_EXIST OR TTSync=$TTSYNC_BACKUP;" > "$list_tmp/indb"
  find "$moviedir" -type f > "$list_tmp/exist"

  #find new files
  grep -vf "$list_tmp/indb" "$list_tmp/exist" > "$list_tmp/new"

  #all IDs wich an old check date:
  db_query "SELECT ID FROM File Where TTCheck < '$DATE' OR TTCheck IS NULL;" | while read line; do
    #for each ID with an old check date ...
    ID=$line
    TTSync=$(db_query "SELECT TTSync FROM File WHERE ID=$ID;")

    
    SIZE=$(db_query "SELECT Size FROM File WHERE ID=$ID;")
    MD5=$(db_query "SELECT MD5 FROM File WHERE ID=$ID;")
  done

  ## dateiliste erstellen die mit DB abgeglichen wird

  ## alle die keien DB.PATH eintrag haben -> file_add

  ## Für alle existierenden Dateien:
  ## * Path=DB.PATH && TTSync == TTSYNC_DEL
  ##    -> DB.Size != 0 && Size == DB.Size -> TTSYNC_DEL -> TTSYNC_EXIST // >>file_undel<< konsider other state ?!?
  ##    -> DB.Size != 0 || Size != DB.Size -> compare if md5 is same
  ##         -> Ja -> TTSYNC_DEL -> TTSYNC_EXIST // >>file_undel<<
  ##         -> NA -> delete DB Entry
  ## * Path=DB.PATH && TTSync == TTSYNC_EXIST / TTSYNC_BACKUP
  ##    -> DB.Size = 0 -> file_add_size
  ##    -> Size != DB.Size -> compare if md5 is same
  ##         -> Ja -> update file size (file_add_size)
  ##         -> NA
  ##            -> makr DB.FID = TTSYNC_DEL
  ##            -> file_add  // this is a new file
  ## * Path=DB.PATH && TTSync == TTSYNC_REMOTE
  ##    -> DB.Size = 0 ->  compare if md5 is same
  ##         -> Ja
  ##            -> update file size (file_add_size)
  ##            -> TTSYNC_REMOTE to TTSYNC_BACKUP
  ##         -> NA
  ##    -> Size = DB.Size TTSYNC_REMOTE to TTSYNC_BACKUP
  ##    -> Size != DB.Size  // Error Remote CP incorect!!!

 ## alle nicht gecheckten path einträge in DB (fiels die nicht existieren)
 ## A: HDD kaput
 ## B: Absichtlich gelöscht
 ## hdd_check // ob eine HDD defekt ist bzw das mounten irgendwo fehlgeschlagen ist
 ## -> ja -> error mesage!
 ## -> na -> set DB.FID TTSYNC_DEL

}

###########################
## help functions #########
###########################

##check & prepair args
[ -z "$moviedir" ] && [ -f "$globalconf" ] && {					# if (no argument) and (globalconf exist)
  if [ -z "$(grep "moviedir=" "$globalconf" )" ]; then			# and (moviedir is NOT in globalconf)
    echo 'neither "movie folder" is set in global config nor given as argument'
    exit 2
  else															# and (moviedir is in globalconf)
    moviedir="$(grep "moviedir=" "$globalconf" | cut -d '=' -f 2)"
  fi
}
[ -d "$moviedir" ] || { echo "moviedir \"$moviedir\" do not exist"; exit 3; } # check moviedir
moviedir=""$(echo $moviedir | sed 's|/$||g')""
[ -z "$moviedir" ] && exit 255 #catch case moviedir="/"

function md5_out_exist() {
  db_query "SELECT CONCAT(MD5, ' ', ' ' ,'$moviedir/', Folder, '/', Name) FROM File WHERE TTSync=$TTSYNC_EXIST OR TTSync=$TTSYNC_BACKUP;" >> $md5list
  exit 0
}

function md5_out_del() {
  db_query "SELECT CONCAT(MD5, ' ', ' ' ,'$moviedir/', Folder, '/', Name) FROM File WHERE TTSync=$TTSYNC_DEL;" >> $md5list
  exit 0
}

# file_size <path> -> (du -b)/1024  [Kb]
function file_size() {
  if [ -f "$1" ]; then
    echo $(($(du -b "$1" | cut -f 1)/1024))
  else
    echo 0
  fi
}

# db_query <query> -> result
function db_query() {
  local args="-sN"  #no headers, no grid
  args+=" -h$dbhost"
  args+=" -u$dbuser"
  [ -n "$dbpwd" ] && args+=" -p$dbpwd"
  args+=" $dbname"
  echo $@ | mysql $args
}

# db_F-ID_getPath <F-ID> -> <Path>
function db_id_getPath() {
  db_query "SELECT CONCAT('$moviedir/', Folder, '/', Name) FROM File WHERE ID=$1;"
}



main #aufruf der main function (eig. programmstart)