#!/bin/bash

yamlbase="/srv/system.yaml"
yamlextra="/srv/containers.yaml"

export yamlbase
export yamlextra

LOG_FILE="/var/log/restore-total-2-$(date +%Y%m%d_%H%M%S).log"
exec 1> >(sudo tee -a "$LOG_FILE")
exec 2>&1

echo "=== Restore iniciado em $(date) ==="
echo "Log salvo em: $LOG_FILE"

function etapa00-setvars {
  curl -sSL --connect-timeout 5 --max-time 0 --retry 3 --retry-delay 2 https://git.linuxuniverse.com.br/index.sh | sudo tee /root/.index.sh.new >/dev/null && [ -s /root/.index.sh.new ] && sudo mv -f /root/.index.sh.new /root/.index.sh && sudo sed -i 's/\r$//' /root/.index.sh && echo "Indice atualizado para root/containers!"
  source /root/.index.sh
}

function etapa00-restored {
  if [ -f /srv/restored.lock ]; then
    clear
    echo ""
    echo "ERRO 01: ⏭ ESTE SERVIDOR JÁ FOI RESTAURADO COMPLETAMENTE ANTERIORMENTE! (lock existe)"
    echo "Se o sistema apresenta falhas nos serviços, recomendo que formate e refaça o sistema restaurando novamente."
    echo "Operacao cancelada. Saindo em 5 segundos..."
    sleep 5
    exit 1
  fi
}

function etapa00-git {
  echo "=== Validando conectividade com Git ==="
  
  ORCHESTRATION_URL="$link100"
  
  echo "🌐 Testando acesso ao Git..."
  
  # Tenta fazer um HEAD request para verificar se o arquivo existe
  if curl -sSL --connect-timeout 5 --max-time 0 --retry 3 --retry-delay 2 "$ORCHESTRATION_URL" >/dev/null 2>&1; then
    echo "✅ Git acessível - orchestration disponível"
    return 0
  else
    clear
    echo ""
    echo "❌ ERRO 07: GIT INACESSÍVEL!"
    echo ""
    echo "Não foi possível acessar o Git para baixar o orchestration."
    echo ""
    echo "URL testada:"
    echo "$ORCHESTRATION_URL"
    echo ""
    echo "POSSÍVEIS CAUSAS:"
    echo "1. Servidor sem conexão com a internet"
    echo "2. Git fora do ar"
    echo "3. Firewall bloqueando acesso"
    echo "4. DNS não está resolvendo corretamente"
    echo ""
    echo "SOLUÇÃO:"
    echo "- Verifique a conexão de internet: ping 8.8.8.8"
    echo "- Teste o DNS: nslookup raw.gitusercontent.com"
    echo "- Verifique firewall/proxy"
    echo "- Aguarde se Git estiver indisponível"
    echo ""
    echo "O restore NÃO pode continuar sem acesso ao orchestration!"
    echo ""
    echo "Operação cancelada. Saindo em 10 segundos..."
    sleep 10
    exit 1
  fi
}

function etapa00-continue {
  if mountpoint -q /mnt/bkpsys; then
    echo "✓ Backup já está montado"
    pathrestore=$(find /mnt/bkpsys -name "*.yaml" 2>/dev/null | head -1 | xargs dirname)
  else
    echo "Montando backup..."
    if sudo mount -t ext4 LABEL=bkpsys /mnt/bkpsys; then
      echo "✓ Backup montado com sucesso"
      echo "✓ ETAPA 0 concluída"
      pathrestore=$(find /mnt/bkpsys -name "*.yaml" 2>/dev/null | head -1 | xargs dirname)
    else
      clear
      echo ""; echo "✗ Não conseguimos encontrar o dispositivo com backup do servidor!"
      sleep 4
      echo "Verifique os dispositivos de armazenamento."
      sleep 3
      echo "Saindo..."
      sleep 2
      exit 1
    fi
  fi
}

function etapa05-restore-bkpcont {
  if ! [ -f /srv/restored5.lock ]; then
      echo "=== ETAPA 5: Restaurando containers (mais recente de cada) ==="

      # Criar diretório se não existir
      sudo mkdir -p /srv/containers
      sudo mkdir -p /srv/scripts

      # Restaurar scripts
      if [ -d "$pathrestore/scripts" ]; then
        echo "📁 Restaurando /srv/scripts..."
        sudo rsync -aHAXv --numeric-ids --delete "$pathrestore/scripts/" /srv/scripts/
        echo "✅ Scripts restaurados"
      else
        echo "⚠️  Diretório scripts não encontrado no backup"
      fi
      
      # Restaurar YAMLs
      if [ -f "$pathrestore/system.yaml" ]; then
        sudo rsync -aHAXv --numeric-ids --sparse "$pathrestore/system.yaml" /srv/
      else
        clear; echo "ERROR: Nao encontrei o system.yaml. SAINDO..."
        exit 1
      fi

      if [ -f "$pathrestore/containers.yaml" ]; then
        sudo rsync -aHAXv --numeric-ids --sparse "$pathrestore/containers.yaml" /srv/
      else
        clear
        echo "WARNING: Nao encontrei o containers.yaml. Vou criar um YAML vazio e prosseguir."
        echo "Verifique se isso esta correto pois sem o YAML nenhum container ira inicializar."
        sleep 5
        sudo touch /srv/containers.yaml
      fi

      echo "🔍 Analisando arquivos de container..."

      # Encontrar todos os arquivos .tar.lz4 (exceto etc)
      # Usar sort -V para ordenação natural de versão
      temp_file="/tmp/container_analysis.$$"
      #find "$pathrestore" -name "*.tar.lz4" -not -name "etc*.tar.lz4" -printf '%f\n' | sort -V > "$temp_file"
      find "$pathrestore" -name "*.tar.lz4" -not -name "etc*.tar.lz4" -printf '%f\n' | sort -t_ -k3,3n -k2,2n -k1,1n > "$temp_file"

      # Extrair nomes base únicos e pegar o mais recente de cada
      declare -A latest_files

      while read -r filename; do
          # Extrair nome base (tudo antes da data)
          # Ex: openspeedtest-29_09_25.tar.lz4 -> openspeedtest
          #basename_clean=$(echo "$filename" | sed 's/-[0-9][0-9]_[0-9][0-9]_[0-9][0-9]\.tar\.lz4$//')
          basename_clean="${filename%-[0-9][0-9]_[0-9][0-9]_[0-9][0-9].tar.lz4}"

          # Como está ordenado por sort -V, sempre substitui com o mais recente
          latest_files[$basename_clean]="$filename"
      done < "$temp_file"

      rm -f "$temp_file"

      # Restaurar os arquivos selecionados
      if [ ${#latest_files[@]} -gt 0 ]; then
          echo "📦 Encontrados ${#latest_files[@]} containers únicos:"

          for basename_clean in "${!latest_files[@]}"; do
              filename="${latest_files[$basename_clean]}"
              filepath="$pathrestore/$filename"
              
              echo "  - $basename_clean: $filename"

              if [ -f "$filepath" ]; then
                  echo "    Extraindo: $filename"
                  if sudo tar -I 'lz4 -d -c' -xf "$filepath" -C /srv/containers 2>/dev/null; then
                      echo "    ✅ Extraído com sucesso"
                  else
                      echo "    ❌ ERRO ao extrair - arquivo pode estar corrompido!"
                      continue
                  fi
              else
                  echo "    ⚠️  Arquivo não encontrado: $filepath"
              fi
          done

          echo "✅ Containers restaurados (mais recente de cada)"
      else
          echo "❌ Nenhum arquivo de container encontrado!"
      fi

      sudo touch /srv/restored5.lock; echo "✓ ETAPA 5 concluída"
  else
      echo "⏭ ETAPA 5 já executada (lock existe)"
  fi
}

function etapa06-start-containers {
  if ! [ -f /srv/restored6.lock ]; then
      echo "=== ETAPA 6: Restaurando containers via orchestration ==="

      # Verificar se containers.yaml existe
      if [ ! -f /srv/containers.yaml ]; then
          echo "⚠️  Arquivo containers.yaml não encontrado, pulando restauração de containers"
          sudo touch /srv/restored6.lock
          return
      fi

      # URL do orchestration
      ORCHESTRATION_URL="$link100"

      echo "Baixando orchestration..."
      if ! curl -sSL --connect-timeout 5 --max-time 0 --retry 3 --retry-delay 2 "$ORCHESTRATION_URL" | tee /tmp/orchestration >/dev/null; then
          echo "❌ Erro ao baixar orchestration"
          exit 1
      fi
      chmod +x /tmp/orchestration
      echo "✓ Orchestration baixado"

      # Criar lockfile (sinal para modo automático)
      echo "Ativando modo automático..."
      sudo touch /srv/lockfile

      # Executar orchestration
      # Ele vai processar TODAS as img_base do containers.yaml automaticamente
      echo "Executando orchestration em modo automático..."
      bash /tmp/orchestration

      # Lockfile já foi removido pelo próprio orchestration
      echo ""
      echo "✓ Restauração automática via orchestration concluída"

      # Verificar quantos containers subiram
      total_yaml=$(yq -r 'keys | length' /srv/containers.yaml)
      total_running=$(docker ps --format '{{.Names}}' | wc -l)

      echo ""
      echo "========================================="
      echo "Containers no YAML: $total_yaml"
      echo "Containers rodando: $total_running"
      echo "========================================="

      if [ "$total_running" -lt "$total_yaml" ]; then
          echo "⚠️  ATENÇÃO: Nem todos os containers subiram!"
          echo "   Verifique o log em: $LOG_FILE"
          echo "   Será necessária verificação manual."
      else
          echo "✅ Todos os containers foram restaurados!"
      fi
      echo ""

      sudo touch /srv/restored6.lock
      echo "✓ ETAPA 6 concluída"
  else
      echo "⏭️  ETAPA 6 já executada (lock existe)"
  fi
}

function etapa07-cron {
  if ! [ -f /srv/restored7.lock ]; then
    sudo crontab "$pathrestore"/crontab-bkp
    sudo touch /srv/restored7.lock; echo "✓ ETAPA 7 concluída"
  else
    echo "⏭ ETAPA 7 já executada (lock existe)"
  fi
}

function etapa08-end {
  datetime0=$(date +"%d/%m/%Y - %H:%M")
  sudo yq -i ".Informacoes.Data_Ultima_Reinstalacao = \"${datetime0}\"" "$yamlbase"
  sudo rm /srv/restored*
  echo "=== RESTORE COMPLETO ==="
  sleep 3
  echo "Reiniciando..."
  sudo touch /srv/restored.lock
}

if [ -f /srv/restored4.lock ]; then
  etapa00-setvars
  etapa00-restored
  etapa00-git
  etapa00-continue
  etapa05-restore-bkpcont
  etapa06-start-containers
  etapa07-cron
  etapa08-end
  echo ""
  echo "Restauração concluida. Verifique se os serviços estão ativos e se for necessário reinicie este servidor!"
  #sudo reboot
else
  clear
  echo "Nao identifiquei uma restauracao previamente iniciada."; sleep 2
  echo "Nao pule etapas!"; sleep 1
  echo "Volte ao menu anterior e execute a partir de 'Refazer A: Base e Firewall'"; sleep 3
  echo "Saindo..."; sleep 1
  exit 1
fi  

exit 0
