#!/bin/bash
#==============================================================================
#  ██████  ███████ ███████ ██   ██ ██████  ███████ ███    ██  ██████ ██   ██ 
# ██       ██      ██      ██  ██  ██   ██ ██      ████   ██ ██      ██   ██ 
# ██   ███ █████   █████   █████   ██████  █████   ██ ██  ██ ██      ███████ 
# ██    ██ ██      ██      ██  ██  ██   ██ ██      ██  ██ ██ ██      ██   ██ 
#  ██████  ███████ ███████ ██   ██ ██████  ███████ ██   ████  ██████ ██   ██ 
#==============================================================================
#
# Geekbench 6 Installer & Runner for Linux
# 
# Dieses Skript automatisiert den Download, die Installation und Ausführung 
# von Geekbench 6 auf Linux-Systemen.
#
# Autor: Verbesserte Version
# Datum: $(date +%Y-%m-%d)
#
#==============================================================================

# Strikte Fehlerbehandlung aktivieren
set -e

# Farbdefinitionen für schönere Ausgaben
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
MAGENTA='\033[0;35m'
CYAN='\033[0;36m'
BOLD='\033[1m'
NC='\033[0m' # No Color

# Funktionen für formatierte Ausgaben
print_info() {
  echo -e "${BLUE}[${BOLD}INFO${NC}${BLUE}]${NC} $1"
}

print_success() {
  echo -e "${GREEN}[${BOLD}OK${NC}${GREEN}]${NC} $1"
}

print_warning() {
  echo -e "${YELLOW}[${BOLD}WARNUNG${NC}${YELLOW}]${NC} $1"
}

print_error() {
  echo -e "${RED}[${BOLD}FEHLER${NC}${RED}]${NC} $1"
}

print_header() {
  echo -e "\n${CYAN}${BOLD}$1${NC}"
  echo -e "${CYAN}$(printf '=%.0s' $(seq 1 ${#1}))${NC}\n"
}

print_banner() {
  clear
  echo -e "${MAGENTA}${BOLD}"
  echo "  ______           _    _                     _      __   "
  echo " / _____)         | |  | |                   | |    / /   "
  echo "| /  ___  ____  _ | |  | |__  _____ ____   __| |___/ /___ "
  echo "| | (___)/ _  |/ || |  |  _ \| ___ |  _ \ / _  |_  )  _  |"
  echo "| \____/( ( | ( (_| |  | |_) ) ____| | | ( (_| |/ /| | | |"
  echo " \_____/ \_||_|\____|  |____/|_____)_| |_|\____|___)_| |_|"
  echo -e "${NC}"
  echo -e "${BLUE}${BOLD}Geekbench 6 Installer & Runner für Linux${NC}"
  echo -e "${BLUE}---------------------------------------------${NC}\n"
}

# Unterstützung für Befehlszeilenargumente
WORKDIR="$HOME/geekbench6"
AUTO_RUN=true
CLEANUP=false
VERBOSE=false

show_help() {
  echo -e "\n${BOLD}Verwendung:${NC} $0 [OPTIONEN]"
  echo -e "\n${BOLD}Optionen:${NC}"
  echo "  -h, --help        Zeigt diese Hilfe an"
  echo "  -d, --directory   Setzt das Arbeitsverzeichnis (Standard: $WORKDIR)"
  echo "  -n, --no-run      Lädt herunter und installiert, führt aber den Benchmark nicht aus"
  echo "  -c, --cleanup     Entfernt die heruntergeladene tar.gz-Datei nach der Installation"
  echo "  -v, --verbose     Ausführlichere Ausgaben"
  echo ""
  exit 0
}

# Befehlszeilenargumente verarbeiten
while [ $# -gt 0 ]; do
  case "$1" in
    -h|--help)
      show_help
      ;;
    -d|--directory)
      WORKDIR="$2"
      shift 2
      ;;
    -n|--no-run)
      AUTO_RUN=false
      shift
      ;;
    -c|--cleanup)
      CLEANUP=true
      shift
      ;;
    -v|--verbose)
      VERBOSE=true
      shift
      ;;
    *)
      print_error "Unbekannte Option: $1"
      show_help
      ;;
  esac
done

# Banner anzeigen
print_banner

# Systemprüfungen
print_header "Systemprüfung"

# Prüfen, ob curl installiert ist
if ! command -v curl &> /dev/null; then
  print_error "curl ist nicht installiert. Bitte installieren Sie es zuerst."
  exit 1
fi
print_success "curl gefunden."

# Prüfen, ob tar installiert ist
if ! command -v tar &> /dev/null; then
  print_error "tar ist nicht installiert. Bitte installieren Sie es zuerst."
  exit 1
fi
print_success "tar gefunden."

# Prüfen, ob es genügend freien Speicherplatz gibt (mindestens 500 MB)
free_space=$(df -m "$HOME" | awk 'NR==2 {print $4}')
if [ "$free_space" -lt 500 ]; then
  print_warning "Weniger als 500 MB freier Speicherplatz verfügbar. Es könnten Probleme auftreten."
else
  print_success "Genügend freier Speicherplatz vorhanden (${free_space} MB)."
fi

# Verzeichnis erstellen
print_header "Vorbereitung"
print_info "Erstelle Arbeitsverzeichnis: $WORKDIR"
mkdir -p "$WORKDIR"
cd "$WORKDIR"
print_success "Arbeitsverzeichnis bereit."

# GitHub-Release-Seite parsen und aktuellstes tar.gz finden
print_header "Download"
print_info "Suche nach neuester Geekbench-Version..."

URL=$(curl -s https://www.geekbench.com/download/linux/ | grep -Eo 'https://cdn\.geekbench\.com/Geekbench-6.*Linux.tar.gz' | head -n1)
if [ -z "$URL" ]; then
    print_error "Konnte keine Download-URL finden."
    exit 1
fi

VERSION=$(echo "$URL" | grep -Eo 'Geekbench-[0-9]+\.[0-9]+\.[0-9]+' | sed 's/Geekbench-//')
print_success "Neueste Version gefunden: Geekbench $VERSION"

FILENAME=$(basename "$URL")
print_info "Starte Download: $FILENAME"
print_info "Von: $URL"

# Fortschrittsanzeige für den Download
if [ "$VERBOSE" = true ]; then
  curl -L "$URL" -o "$FILENAME" --progress-bar
else
  # Einfacher Fortschrittsbalken
  echo -ne "${YELLOW}[${NC}"
  for i in {1..30}; do echo -ne " "; done
  echo -ne "${YELLOW}]${NC} 0%"
  
  # Herunterladen mit Zähler
  total_size=$(curl -sI "$URL" | grep -i content-length | awk '{print $2}' | tr -d '\r')
  downloaded=0
  
  # Temp-Datei für curl-Output
  tmp_file=$(mktemp)
  
  # Starte den Download im Hintergrund
  curl -L "$URL" -o "$FILENAME" > "$tmp_file" 2>&1 &
  pid=$!
  
  # Überwache den Fortschritt
  while kill -0 $pid 2>/dev/null; do
    if [ -f "$FILENAME" ]; then
      current_size=$(stat -c%s "$FILENAME" 2>/dev/null || echo 0)
      percent=$((current_size * 100 / total_size))
      bars=$((percent * 30 / 100))
      
      echo -ne "\r${YELLOW}[${NC}"
      for i in $(seq 1 $bars); do echo -ne "${GREEN}#${NC}"; done
      for i in $(seq 1 $((30 - bars))); do echo -ne " "; done
      echo -ne "${YELLOW}]${NC} ${percent}%"
    fi
    sleep 0.5
  done
  
  # Abschluss-Ausgabe
  echo -ne "\r${YELLOW}[${NC}"
  for i in {1..30}; do echo -ne "${GREEN}#${NC}"; done
  echo -e "${YELLOW}]${NC} 100%"
  
  # Aufräumen
  rm -f "$tmp_file"
fi

print_success "Download abgeschlossen."

# Entpacken
print_header "Installation"
print_info "Entpacke $FILENAME..."

if [ "$VERBOSE" = true ]; then
  tar -xvzf "$FILENAME"
else
  tar -xzf "$FILENAME"
fi

# Ordnernamen finden
EXTRACTED_DIR=$(find . -maxdepth 1 -type d -name "Geekbench-6*" | head -n1)
if [ -z "$EXTRACTED_DIR" ]; then
  print_error "Entpacken fehlgeschlagen. Konnte kein Geekbench-Verzeichnis finden."
  exit 1
fi

cd "$EXTRACTED_DIR" || { print_error "Konnte nicht in das entpackte Verzeichnis wechseln."; exit 1; }
print_success "Dateien erfolgreich entpackt nach: $EXTRACTED_DIR"

# Nach dem Entpacken aufräumen falls gewünscht
if [ "$CLEANUP" = true ]; then
  print_info "Aufräumen - Lösche Archivdatei..."
  rm -f "$WORKDIR/$FILENAME"
  print_success "Archivdatei wurde gelöscht."
fi

# Ausführungsberechtigungen setzen
print_info "Setze Ausführungsberechtigungen..."
chmod +x geekbench6
print_success "Geekbench 6 erfolgreich installiert."

# Zusammenfassung 
print_header "Zusammenfassung"
echo -e "Geekbench 6 Version:  ${BOLD}$VERSION${NC}"
echo -e "Installationsort:     ${BOLD}$PWD${NC}"
echo -e "Ausführbare Datei:    ${BOLD}$PWD/geekbench6${NC}"

# Benchmark ausführen, falls gewünscht
if [ "$AUTO_RUN" = true ]; then
  print_header "Benchmark starten"
  print_info "Starte Geekbench 6..."
  echo ""
  
  # Wir erstellen einen Rahmen für die Geekbench-Ausgabe
  echo -e "${CYAN}${BOLD}+$(printf '=%.0s' $(seq 1 60))+${NC}"
  echo -e "${CYAN}${BOLD}|${NC}$(printf ' %.0s' $(seq 1 60))${CYAN}${BOLD}|${NC}"
  echo -e "${CYAN}${BOLD}|$(printf ' %.0s' $(seq 1 20))GEEKBENCH 6 AUSGABE$(printf ' %.0s' $(seq 1 20))${BOLD}|${NC}"
  echo -e "${CYAN}${BOLD}|${NC}$(printf ' %.0s' $(seq 1 60))${CYAN}${BOLD}|${NC}"
  echo -e "${CYAN}${BOLD}+$(printf '=%.0s' $(seq 1 60))+${NC}"
  echo ""
  
  # Den Benchmark starten
  ./geekbench6
  
  echo ""
  echo -e "${CYAN}${BOLD}+$(printf '=%.0s' $(seq 1 60))+${NC}"
else
  print_info "Benchmark wird nicht automatisch gestartet (--no-run Option)."
  print_info "Sie können Geekbench 6 später mit folgendem Befehl starten:"
  echo -e "  ${BOLD}cd $PWD && ./geekbench6${NC}"
fi

print_header "Fertig"
print_success "Geekbench 6 ist bereit. Vielen Dank für die Nutzung dieses Skripts!"
echo ""