#!/usr/bin/env bash
set -u
set -o pipefail

BACKUP_PATH="/var/backups/bukdaily"

for logdir in /var/opt/*buk*/log /var/opt/arcusip/log; do
  [ -d "$logdir" ] || continue

  prjname="$(basename "$(dirname "$logdir")")"

  cd "$logdir" || {
    echo "ERROR: cannot cd to $logdir" >&2
    continue
  }

  for i in {1..5}; do
    DATE="$(date --date="$i days ago" +%y%m%d)" || {
      echo "ERROR: cannot calculate date for $i days ago" >&2
      exit 1
    }

    dest_dir="$BACKUP_PATH/$DATE"
    mkdir -p "$dest_dir" || {
      echo "ERROR: cannot create $dest_dir" >&2
      exit 1
    }

    # Удаляем временные файлы за дату
    find . -maxdepth 1 -type f -name "*.${DATE}.tmp" -delete

    files=(
      "com.bukkassa.$DATE.log"
      "com2.bukkassa.$DATE.log"
      "com.bukpplus.$DATE.log"
      "com2.bukpplus.$DATE.log"
      "com.bukloop.$DATE.log"
      "com2.bukloop.$DATE.log"
      "com.buklevel.$DATE.log"
      "com2.buklevel.$DATE.log"
      "com.arcus.$DATE.log"
      "com.cachcode.$DATE.log"
      "error.$DATE.log"
      "$DATE.xlog"
      "$DATE.log"
      "$DATE.txt"
      "$DATE.prn"
    )

    for file in "${files[@]}"; do
      matches=()

      while IFS= read -r -d '' f; do
        matches+=("$f")
      done < <(find . -maxdepth 1 -type f -name "*$file" -print0)

      [ "${#matches[@]}" -gt 0 ] || continue

      archive="${prjname}.${file}.tgz"

      if tar -czf "$archive" -- "${matches[@]}"; then
        mv "$archive" "$dest_dir/" && rm -f -- "${matches[@]}"
        echo "OK: archived ${#matches[@]} file(s) to $dest_dir/$archive"
      else
        echo "ERROR: tar failed for $archive in $logdir" >&2
        rm -f -- "$archive"
      fi
    done

    # Архивируем arcus-файлы за дату
    arcus_matches=()

    while IFS= read -r -d '' f; do
      arcus_matches+=("$f")
    done < <(find . -maxdepth 1 -type f -name "arcus*${DATE}*" -print0)

    if [ "${#arcus_matches[@]}" -gt 0 ]; then
      archive="${prjname}.arcus.${DATE}.tgz"

      if tar -czf "$archive" -- "${arcus_matches[@]}"; then
        mv "$archive" "$dest_dir/" && rm -f -- "${arcus_matches[@]}"
        echo "OK: archived ${#arcus_matches[@]} arcus file(s) to $dest_dir/$archive"
      else
        echo "ERROR: tar failed for $archive in $logdir" >&2
        rm -f -- "$archive"
      fi
    fi
  done

  # php_error.log обрабатываем один раз, а не внутри цикла за 5 дней
  if [ -f "php_error.log" ]; then
    DATE="$(date --date="1 day ago" +%y%m%d)"
    dest_dir="$BACKUP_PATH/$DATE"
    mkdir -p "$dest_dir" || exit 1

    php_file="php_error.${DATE}.log"
    archive="${prjname}.${php_file}.tgz"

    mv "php_error.log" "$php_file"

    if tar -czf "$archive" -- "$php_file"; then
      mv "$archive" "$dest_dir/" && rm -f -- "$php_file"
      echo "OK: archived php_error.log to $dest_dir/$archive"
    else
      echo "ERROR: tar failed for $archive in $logdir" >&2
      mv "$php_file" "php_error.log"
      rm -f -- "$archive"
    fi
  fi
done

# Оставляем только последние 700 папок в BACKUP_PATH
if [ -d "$BACKUP_PATH" ]; then
  find "$BACKUP_PATH" -mindepth 1 -maxdepth 1 -type d -printf '%f\n' \
    | grep -E '^[0-9]{6}$' \
    | sort -r \
    | tail -n +701 \
    | while IFS= read -r old_dir; do
        rm -rf -- "$BACKUP_PATH/$old_dir"
        echo "OK: removed old backup directory $BACKUP_PATH/$old_dir"
      done
fi

exit 0
