#!/bin/bash

set -o nounset

log_message()
{
  if [ $# -ne 1 ];
  then
    echo "Ожидается параметр"
    return -1;
  fi
  message=$1
  echo "`date +"%d-%m-%Y %H:%M:%S "`$message"
}

trashOldFolders()
{
  if [ $# -ne 2 ]; then
    echo "Ожидается два параметра"
    return -1
  fi
  srcPath=$1
  local dayscount=$2
  today=`date --date=today +%s`
  [ ! -d $srcPath ] && return 0
  for srcdir in `find $srcPath -maxdepth 1 -type d -printf "%f\n"|grep -P "\d\d-\d\d-\d\d"|cut -d\- -f3,2,1`
  do
    local yymmdd=`echo $srcdir| awk 'BEGIN {FS="-"} {printf "%s-%s-%s",$3,$2,$1}'`
    local diffdays
    let diffdays=(`date --date=today +%s`-`date --date=$yymmdd +%s`)/86400
    if [ $diffdays -ge $dayscount ]; then
      local sz=`du -h $srcPath/$srcdir|cut -f1`
      log_message "Удаляется папка $srcPath/$srcdir (Дней: $diffdays<=$dayscount) $sz"
      rm -rf $srcPath/$srcdir
    fi
  done
}

if [ $# -eq 0 ]; then
  echo "Утилита создает папки с недельными и месячными архивами из папок названия которых содержат в себе дату в формате dd-mm-yy "
  echo "Использование: `basename $0` backup_folder"
  exit 1
fi

function create_folder () {
  if [ ! -d $1 ]; then
    local res=`mkdir -p $1`
    if [ $? -ne 0 ]; then
      log_message "Ошибка создания папки $1: $res"
      return -1
    fi
  fi
  return 0
}

function run () {

# параметры days, weeks, months задаются в файле dparams (если он есть)
[ -f /home/db/db-scripts/dbparams ] && source /home/db/db-scripts/dbparams
local daysCount=${days:-7}
local weeksCount=${weeks:-4}
local monthsCount=${months:-12}

# Сколько дней хранить ежедневные архивы
local keep_lastweek=$(( $daysCount ))
# Сколько дней хранить еженедельные архивы
local keep_lastmonth=$(( $weeksCount * 7 ))
# Сколько дней хранить ежемесячные архивы
local keep_lastyear=$(( monthsCount * 31 ))

#echo "daysCount=$daysCount weeksCount=$weeksCount monthsCount=$monthsCount
#keep_lastWeek=$keep_lastweek keep_lastmonth=$keep_lastmonth keep_lastyear=$keep_lastyear"

local srcdir
local backup_folder=`readlink -f "$1"`

# readlink: Приводит путь типа ./path/to/dir/or/file./../ к абсолютному /path/to/dir/or/file
local backup_weekly_folder=$backup_folder/weekly
local backup_monthly_folder=$backup_folder/monthly

#log_message "[\$0]=$0"
#log_message "[\$1]=$1"
#log_message "backup_folder=$backup_folder"

# --- Start logging --- #
LOG=$backup_folder/arrange.log
#echo "logging into $LOG"
exec 6>&1   # Link file descriptor #6 with stdout
exec >> $LOG 2>&1 # Replace stdout with file $LOG

for srcdir in `find $backup_folder -maxdepth 1 -type d -printf "%f\\n" |grep -P "\d\d-\d\d-\d\d"`
do
  # Поменять местами год и день (yy-mm-dd)
  dir=`echo $srcdir| awk 'BEGIN {FS="-"} {printf "%s-%s-%s\n",$3,$2,$1}'`
  # Получить день, день недели и разницу в днях от текущей даты
  local day=`date --date=$dir +%_d`
  local dayofweek=`date --date=$dir +%u`
  let diffdays=(`date --date=today +%s`-`date --date=$dir +%s`)/86400
  # Месячный и недельный архив
  if [ $day -eq 1 ]; then
    create_folder $backup_monthly_folder
    [ $? -ne 0 ] && continue
    local dest_folder=$backup_monthly_folder
  else
    if [ $dayofweek -eq 1 ]; then
      create_folder $backup_weekly_folder
      [ $? -ne 0 ] && continue
      local dest_folder=$backup_weekly_folder
    else
      local dest_folder=""
    fi
  fi
  if [ "$dest_folder" != "" ]; then
    log_message "cp -a $backup_folder/$srcdir $dest_folder"
    yes | cp -a $backup_folder/$srcdir $dest_folder
    if [ $? -ne 0 ]; then
      log_message "Ошибка копирования $srcfile в $backup_folder/$srcdir"
      continue
    fi
  fi
done


# ищем сегодняшний Zip
# если есть значит надо почистить старые архивы в папках weekly monthly
if [ -d $backup_folder ]; then
  log_message "=== Удаление старых архивов  ==="
  for lastZipDate in `stat -c '%y' $backup_folder/*.zip|cut -d \  -f1`
  do
    let diffdays=(`date --date=today +%s`-`date --date=$lastZipDate +%s`)/86400
    if [ $diffdays == 0 ]; then
      # diffdays=0 если дата архива сегодняшняя
      trashOldFolders "$backup_folder" $keep_lastweek
      trashOldFolders "$backup_weekly_folder" $keep_lastmonth
      trashOldFolders "$backup_monthly_folder" $keep_lastyear
      break
    fi
  done
fi
}

run $1