#!/usr/bin/env bash
set -Eeuo pipefail

# Uso:
#   cd /caminho/para/20260418_140853
#   sudo bash restaurar_backup_diretorio.sh
#
# Opções:
#   --somente-arquivos   Restaura apenas arquivos
#   --somente-banco      Restaura apenas banco
#   --estrutura          Usa o dump de estrutura em vez do dump completo
#   --sem-backup-atual   Não gera cópia de segurança dos arquivos atuais

RAIZ_SISTEMA="/var/www/html"
SOMENTE_ARQUIVOS=0
SOMENTE_BANCO=0
USAR_ESTRUTURA=0
GERAR_BACKUP_ATUAL=1

for arg in "$@"; do
  case "$arg" in
    --somente-arquivos) SOMENTE_ARQUIVOS=1 ;;
    --somente-banco) SOMENTE_BANCO=1 ;;
    --estrutura) USAR_ESTRUTURA=1 ;;
    --sem-backup-atual) GERAR_BACKUP_ATUAL=0 ;;
    -h|--help)
      sed -n '1,20p' "$0"
      exit 0
      ;;
    *)
      echo "[ERRO] Opção desconhecida: $arg" >&2
      exit 1
      ;;
  esac
done

if [[ $SOMENTE_ARQUIVOS -eq 1 && $SOMENTE_BANCO -eq 1 ]]; then
  echo "[ERRO] Não use --somente-arquivos e --somente-banco juntos." >&2
  exit 1
fi

# Validar diretório do backup
shopt -s nullglob
SQL_COMPLETO=(backup_db_completo_*.sql)
SQL_ESTRUTURA=(backup_db_estrutura_*.sql)
TAR_ARQUIVOS=(backup_arquivos_*.tar.gz)
shopt -u nullglob

if [[ ${#SQL_COMPLETO[@]} -eq 0 && ${#SQL_ESTRUTURA[@]} -eq 0 && ${#TAR_ARQUIVOS[@]} -eq 0 ]]; then
  echo "[ERRO] Este diretório não parece ser o backup extraído." >&2
  echo "        Esperado: backup_db_completo_*.sql, backup_db_estrutura_*.sql, backup_arquivos_*.tar.gz" >&2
  exit 1
fi

if [[ ${#SQL_COMPLETO[@]} -gt 1 || ${#SQL_ESTRUTURA[@]} -gt 1 || ${#TAR_ARQUIVOS[@]} -gt 1 ]]; then
  echo "[ERRO] Há mais de um arquivo de backup do mesmo tipo no diretório. Deixe apenas um conjunto." >&2
  exit 1
fi

SQL_COMPLETO_FILE="${SQL_COMPLETO[0]:-}"
SQL_ESTRUTURA_FILE="${SQL_ESTRUTURA[0]:-}"
TAR_FILE="${TAR_ARQUIVOS[0]:-}"

if [[ $USAR_ESTRUTURA -eq 1 ]]; then
  SQL_ESCOLHIDO="$SQL_ESTRUTURA_FILE"
else
  SQL_ESCOLHIDO="$SQL_COMPLETO_FILE"
fi

if [[ -z "$SQL_ESCOLHIDO" && $SOMENTE_ARQUIVOS -eq 0 ]]; then
  echo "[ERRO] Dump SQL necessário não encontrado no diretório atual." >&2
  exit 1
fi

TMP_DIR="$(mktemp -d /tmp/restore_robo.XXXXXX)"
BACKUP_ATUAL_DIR="/tmp/backup_pre_restore_$(date +%Y%m%d_%H%M%S)"
trap 'rm -rf "$TMP_DIR"' EXIT

log() { echo "[$(date '+%F %T')] $*"; }

# Extrair credenciais do config.php (backup primeiro, sistema atual como fallback)
extrair_php_const() {
  local arquivo="$1"
  local nome="$2"
  php -r '
    $f = file_get_contents($argv[1]);
    $name = $argv[2];
    if (preg_match("/define\\(\\s*[\"\x27]" . preg_quote($name, "/") . "[\"\x27]\\s*,\\s*[\"\x27](.*?)[\"\x27]\\s*\\)\\s*;/s", $f, $m)) {
      echo $m[1];
    }
  ' "$arquivo" "$nome" 2>/dev/null || true
}

CONFIG_FONTE=""
if [[ -f "config.php" ]]; then
  CONFIG_FONTE="config.php"
elif [[ -f "$RAIZ_SISTEMA/config.php" ]]; then
  CONFIG_FONTE="$RAIZ_SISTEMA/config.php"
fi

if [[ -z "$CONFIG_FONTE" && $SOMENTE_ARQUIVOS -eq 0 ]]; then
  echo "[ERRO] Não encontrei config.php nem no backup nem em $RAIZ_SISTEMA." >&2
  exit 1
fi

DB_HOST=""
DB_NAME=""
DB_USER=""
DB_PASS=""

if [[ -n "$CONFIG_FONTE" ]]; then
  DB_HOST="$(extrair_php_const "$CONFIG_FONTE" DB_HOST)"
  DB_NAME="$(extrair_php_const "$CONFIG_FONTE" DB_NAME)"
  DB_USER="$(extrair_php_const "$CONFIG_FONTE" DB_USER)"
  DB_PASS="$(extrair_php_const "$CONFIG_FONTE" DB_PASS)"
fi

if [[ $SOMENTE_BANCO -eq 0 ]]; then
  if [[ -z "$TAR_FILE" ]]; then
    log "[AVISO] Backup de arquivos não encontrado. Pulando restauração de arquivos."
  else
    log "Extraindo arquivos do backup: $TAR_FILE"
    tar -xzf "$TAR_FILE" -C "$TMP_DIR"

    if [[ $GERAR_BACKUP_ATUAL -eq 1 ]]; then
      mkdir -p "$BACKUP_ATUAL_DIR"
      log "Gerando backup dos arquivos atuais em: $BACKUP_ATUAL_DIR"
      [[ -f "$RAIZ_SISTEMA/config.php" ]] && cp -a "$RAIZ_SISTEMA/config.php" "$BACKUP_ATUAL_DIR/" || true
      [[ -f "$RAIZ_SISTEMA/worker_montado_debug.py" ]] && cp -a "$RAIZ_SISTEMA/worker_montado_debug.py" "$BACKUP_ATUAL_DIR/" || true
      if [[ -f "$RAIZ_SISTEMA/atendimento/workers/robot_worker.py" ]]; then
        mkdir -p "$BACKUP_ATUAL_DIR/atendimento/workers"
        cp -a "$RAIZ_SISTEMA/atendimento/workers/robot_worker.py" "$BACKUP_ATUAL_DIR/atendimento/workers/"
      fi
    fi

    log "Restaurando arquivos para $RAIZ_SISTEMA"
    [[ -f "$TMP_DIR/config.php" ]] && install -m 0644 "$TMP_DIR/config.php" "$RAIZ_SISTEMA/config.php"
    [[ -f "$TMP_DIR/worker_montado_debug.py" ]] && install -m 0644 "$TMP_DIR/worker_montado_debug.py" "$RAIZ_SISTEMA/worker_montado_debug.py"
    if [[ -f "$TMP_DIR/atendimento/workers/robot_worker.py" ]]; then
      mkdir -p "$RAIZ_SISTEMA/atendimento/workers"
      install -m 0644 "$TMP_DIR/atendimento/workers/robot_worker.py" "$RAIZ_SISTEMA/atendimento/workers/robot_worker.py"
    fi
    log "Arquivos restaurados."
  fi
fi

if [[ $SOMENTE_ARQUIVOS -eq 0 ]]; then
  if [[ -z "$DB_HOST" || -z "$DB_NAME" || -z "$DB_USER" ]]; then
    echo "[ERRO] Não consegui extrair as credenciais do banco do config.php." >&2
    exit 1
  fi

  log "Restaurando banco: $DB_NAME em $DB_HOST com usuário $DB_USER"
  export MYSQL_PWD="$DB_PASS"
  mysql --host="$DB_HOST" --user="$DB_USER" --default-character-set=utf8mb4 "$DB_NAME" < "$SQL_ESCOLHIDO"
  unset MYSQL_PWD
  log "Banco restaurado com sucesso usando: $SQL_ESCOLHIDO"
fi

log "Restauração concluída."
if [[ $GERAR_BACKUP_ATUAL -eq 1 && $SOMENTE_BANCO -eq 0 && -d "$BACKUP_ATUAL_DIR" ]]; then
  log "Backup pré-restauração dos arquivos atuais salvo em: $BACKUP_ATUAL_DIR"
fi
