#!/bin/bash
# setup.sh — Aziros Server Setup
# Verwendung: ./setup.sh [development|staging|production]
# Auf einem frischen Debian 12 Server als root ausführen

set -e  # Abbrechen bei Fehler

MODE=${1:-production}
REPO="https://git.nexlab.at/boban/aziros.git"
USER="nexxo"

echo ""
echo "╔══════════════════════════════════════╗"
echo "║     Aziros Server Setup v1.0         ║"
echo "║     Mode: $MODE                      ║"
echo "╚══════════════════════════════════════╝"
echo ""

# ═══════════════════════════════════════
# ROOT CHECK
# ═══════════════════════════════════════
if [ "$EUID" -ne 0 ]; then
  echo "❌ Bitte als root ausführen"
  exit 1
fi

# ═══════════════════════════════════════
# SCHRITT 1 — System Update
# ═══════════════════════════════════════
echo "→ System wird aktualisiert..."
apt update && apt upgrade -y
apt install -y curl git nano ufw \
  ca-certificates gnupg2 \
  apt-transport-https \
  net-tools openssh-server

# ═══════════════════════════════════════
# SCHRITT 2 — User anlegen
# ═══════════════════════════════════════
if id "$USER" &>/dev/null; then
  echo "→ User $USER existiert bereits"
else
  echo ""
  echo "→ User '$USER' wird erstellt..."
  adduser --gecos "" $USER
  usermod -aG sudo $USER
  echo "✅ User $USER erstellt"
fi

# ═══════════════════════════════════════
# SCHRITT 3 — Docker installieren
# ═══════════════════════════════════════
echo "→ Docker wird installiert..."
curl -fsSL https://get.docker.com | sh
usermod -aG docker $USER
echo "✅ Docker installiert"

# ═══════════════════════════════════════
# SCHRITT 4 — UFW Firewall
# ═══════════════════════════════════════
echo "→ Firewall wird konfiguriert..."
ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw allow 8080/tcp
ufw --force enable
echo "✅ Firewall konfiguriert"

# ═══════════════════════════════════════
# SCHRITT 5 — Git Credentials
# ═══════════════════════════════════════
echo "→ Git wird konfiguriert..."
sudo -u $USER git config \
  --global credential.helper store
sudo -u $USER git config \
  --global user.name "Aziros Deploy"
sudo -u $USER git config \
  --global user.email "deploy@aziros.com"

# ═══════════════════════════════════════
# SCHRITT 6 — Repo clonen
# ═══════════════════════════════════════
echo "→ Repository wird geklont..."
if [ -d "/home/$USER/aziros" ]; then
  echo "→ Repo existiert bereits — pull"
  sudo -u $USER git -C \
    /home/$USER/aziros pull origin main
else
  sudo -u $USER git clone \
    $REPO /home/$USER/aziros
fi
echo "✅ Repository bereit"

# ═══════════════════════════════════════
# SCHRITT 7 — .env kopieren
# ═══════════════════════════════════════
echo ""
echo "→ .env Setup für Mode: $MODE"

ENV_FILE="/home/$USER/aziros/src/.env"

if [ "$MODE" = "development" ]; then
  SRC_ENV=".env.development"
elif [ "$MODE" = "staging" ]; then
  SRC_ENV=".env.staging"
else
  SRC_ENV=".env.production"
fi

if [ ! -f "$ENV_FILE" ]; then
  echo ""
  echo "╔══════════════════════════════════════╗"
  echo "║  .env fehlt — bitte jetzt kopieren   ║"
  echo "╚══════════════════════════════════════╝"
  echo ""
  echo "Führe auf dem lokalen Server aus:"
  echo ""
  echo "  scp ~/aziros/src/$SRC_ENV \\"
  echo "    $USER@$(hostname -I | awk '{print $1}'):~/aziros/src/.env"
  echo ""
  read -p "Drücke ENTER wenn .env kopiert wurde..."

  if [ ! -f "$ENV_FILE" ]; then
    echo "❌ .env fehlt noch — Abbruch"
    exit 1
  fi
fi

echo "✅ .env vorhanden"

# ═══════════════════════════════════════
# SCHRITT 8 — Docker Compose starten
# ═══════════════════════════════════════
echo "→ Docker Stack wird gestartet..."
cd /home/$USER/aziros

COMPOSE_FILE="docker-compose.yml"
if [ "$MODE" = "development" ]; then
  COMPOSE_FILE="docker-compose.development.yml"
elif [ "$MODE" = "staging" ]; then
  COMPOSE_FILE="docker-compose.staging.yml"
fi

sudo -u $USER docker compose \
  -f $COMPOSE_FILE up -d --build

echo "→ Warte bis DB bereit ist..."
sleep 15

# ═══════════════════════════════════════
# SCHRITT 9 — Laravel Setup
# ═══════════════════════════════════════
echo "→ Laravel wird konfiguriert..."

sudo -u $USER docker compose \
  -f $COMPOSE_FILE exec -T app \
  php artisan migrate --force

sudo -u $USER docker compose \
  -f $COMPOSE_FILE exec -T app \
  php artisan config:cache

sudo -u $USER docker compose \
  -f $COMPOSE_FILE exec -T app \
  php artisan view:cache

sudo -u $USER docker compose \
  -f $COMPOSE_FILE exec -T app \
  php artisan route:cache

sudo -u $USER docker compose \
  -f $COMPOSE_FILE exec -T app \
  php artisan storage:link

echo "✅ Laravel konfiguriert"

# ═══════════════════════════════════════
# SCHRITT 10 — Status
# ═══════════════════════════════════════
echo ""
echo "╔══════════════════════════════════════╗"
echo "║         Setup abgeschlossen ✅        ║"
echo "╚══════════════════════════════════════╝"
echo ""
echo "Mode:     $MODE"
echo "Compose:  $COMPOSE_FILE"
echo ""
echo "Docker Status:"
sudo -u $USER docker compose \
  -f $COMPOSE_FILE ps
echo ""

if [ "$MODE" = "staging" ]; then
  echo "URL: https://app.staging.aziros.com"
elif [ "$MODE" = "development" ]; then
  echo "URL: http://app.aziros.local"
else
  echo "URL: https://app.aziros.com"
fi

echo ""
echo "Neu einloggen damit Docker-Gruppe aktiv:"
echo "  su - $USER"
