#!/bin/bash
datetime=$(date +"%d_%m_%y_%H_%M")
source=$(sed -n '1p' /srv/scripts/config/backupcont)
destiny=$(sed -n '2p' /srv/scripts/config/backupcont)

if [ -n "$SUDO_USER" ]; then
  source /home/$SUDO_USER/.index.sh
else
  source $HOME/.index.sh
fi

if ! [ -d "$destiny" ]; then
  clear
  echo "Nenhum backup encontrado ainda. Saindo..."
  sleep 3
  exit 1
fi

function start {
  files=()
  temp_files=()

  while IFS= read -r -d $'\0' file; do
    temp_files+=("$file")
  done < <(find "$destiny" -type f -name "*.tar.lz4" -print0)
  
  # Ordenar por nome do arquivo (basename) ignorando caminho
  IFS=$'\n' sorted_files=($(printf '%s\n' "${temp_files[@]}" | sort -k1,1 -t/ | sort -t/ -k$(($(echo "${temp_files[0]}" | tr -cd '/' | wc -c) + 1))))
  
  readarray -t sorted_files < <(printf '%s\n' "${temp_files[@]}" | while read -r file; do
    echo "$(basename "$file")|$file"
  done | sort | cut -d'|' -f2)
  
  for file in "${sorted_files[@]}"; do
    files+=("$file" "")
  done

  [ ${#files[@]} -eq 0 ] && {
    clear
    echo ""
    echo "Nenhum arquivo de backup encontrado!"
    echo ""
    sleep 3
  } || {
    file=$(dialog --stdout --title "Escolha um arquivo de Backup:" --cancel-label "Sair" --menu "Lista de backups encontrados:" 0 0 0 "${files[@]}")
    [ $? -ne 0 ] && return
    NAME="$(basename "$file" .tar.lz4)"
    file2=$(echo "$NAME" | sed 's/.\{9\}$//')
    VALUE0=$(dialog --help-button --help-label 'Riscos' --ok-label "Restaurar" --title "Restauracao" --form "Restaurando o seguinte container: \n\n$file\n\nPOR FAVOR CONFIRME QUE VOCE ESTA DE ACORDO COM OS RISCOS INERENTES A ESTA RESTAURACAO! \n\nRepita no campo abaixo: \neu estou ciente dos riscos" 18 50 0 \
"." 1 1 "$VALUE1" 1 1 50 0 \
3>&1 1>&2 2>&3 3>&- > /dev/tty)
    case $? in
      0) echo "." > /dev/null ;;
      1) exit ;;
      2) dialog --title "RISCOS" --msgbox "Os riscos sao relativamente baixos. \n\n
O container sera parado, o backup restaurado e o servico iniciado em seguida automaticamente. O procedimento de restauracao por si nao causa problemas. \n\nPorem se voce restaurar uma versao muito antiga do Active Directory, Nextcloud, MySQL ou Syncthing, ou seja, qualquer servico altamente dependente de bancos de dados, podera ter corrompimento de metadados e ate falhas de integracao ao comunicar com os clientes previamente conectados! \n\nSe for restaurar, tente restaurar backups mais recentes para evitar imprevistos." 23 50 ; return ;;
    esac
    var1=$(echo "$VALUE0" | sed -n 1p)
    [ "$var1" = "eu estou ciente dos riscos" ] && {
      clear ; echo ""; echo "Parando o container $file2. Aguarde pacientemente, isso pode levar varios minutos!"; echo ""
      sleep 1
      docker stop "$file2" &&
      clear; echo ""; echo "Fazendo um backup do atual container $file2. Por favor, insira a senha do Administrador!"; echo ""
      sudo mkdir -p /srv/backup4restore/
      clear ; echo ""; echo "Geramos um backup do atual container em /srv/backup4restore/!"; echo ""; sleep 3
      sudo tar -I 'lz4 -1 -c -' -cpf /srv/backup4restore/"$file2"-"$datetime".tar.lz4 "$source"/"$file2" &&
      clear ; echo ""; echo "O backup gerado esta separado em /srv/backup4restore/!"; echo ""; sleep 3
      clear; echo ""; echo "Restaurando o backup escolhido. Aguarde pacientemente, isso pode levar varios minutos!"; echo ""
      sudo tar -I 'lz4 -d -c -' -xf "$file" -C /srv/containers/ && sleep 3
      clear; echo ""; echo "Iniciando o container $file2 sob a restauracao realizada..."; echo ""
      docker start "$file2" &&
      clear; echo ""; echo "Restauracao concluida! Verifique se o servico esta funcional."; echo ""
      sleep 3
    } || {
      clear; echo ""; echo "Repete a frase por favor! Saindo..."
      sleep 3
    }
  }
}
start
exit 1
