#!/bin/bash
set -e

MODE=${1:-production}

echo ""
echo "╔══════════════════════════════════════╗"
echo "║     Aziros Server Setup              ║"
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
echo "✅ System aktualisiert"

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

# ═══════════════════════════════════════
# SCHRITT 3 — Docker installieren
# ═══════════════════════════════════════
if command -v docker &>/dev/null; then
  echo "→ Docker bereits installiert"
else
  echo "→ Docker wird installiert..."
  curl -fsSL https://get.docker.com | sh
  echo "✅ Docker installiert"
fi
usermod -aG docker $USER

# ═══════════════════════════════════════
# SCHRITT 4 — 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 konfigurieren
# ═══════════════════════════════════════
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 — Git Token + Repo clonen
# ═══════════════════════════════════════
echo "→ Gitea Access Token eingeben:"
echo "  (Gitea → Einstellungen → Anwendungen → Token erstellen)"
read -sp "Token: " GIT_TOKEN
echo ""

# Credentials speichern:
echo "https://token:$GIT_TOKEN@git.nexlab.at" > \
  /home/$USER/.git-credentials
chmod 600 /home/$USER/.git-credentials
chown $USER:$USER /home/$USER/.git-credentials

# Git credential helper setzen:
sudo -u $USER git config \
  --global credential.helper store

# Repo URL mit Token:
REPO="https://token:$GIT_TOKEN@git.nexlab.at/boban/aziros.git"

echo "→ Repository wird geklont..."
if [ -d "/home/$USER/aziros/.git" ]; then
  echo "→ Repo existiert — pull"
  git config --global --add safe.directory \
    /home/$USER/aziros
  sudo -u $USER git -C \
    /home/$USER/aziros pull origin main
else
  rm -rf /home/$USER/aziros
  sudo -u $USER git clone \
    $REPO /home/$USER/aziros
  git config --global --add safe.directory \
    /home/$USER/aziros
fi
echo "✅ Repository bereit"

# ═══════════════════════════════════════
# SCHRITT 7 — .env vom lokalen Server holen
# ═══════════════════════════════════════
ENV_FILE="/home/$USER/aziros/src/.env"

if [ ! -f "$ENV_FILE" ]; then
  echo ""
  echo "→ .env wird vom lokalen Server geholt..."
  echo ""
  read -p "Lokale Server IP: " LOCAL_IP
  read -p "Lokaler User (z.B. nexxo): " LOCAL_USER
  read -sp "Passwort von $LOCAL_USER@$LOCAL_IP: " \
    LOCAL_PASS
  echo ""

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

  # sshpass installieren:
  apt install -y sshpass -q

  # SSH Key erstellen falls nicht vorhanden:
  if [ ! -f "/home/$USER/.ssh/id_ed25519" ]; then
    echo "→ SSH Key wird erstellt..."
    sudo -u $USER ssh-keygen -t ed25519 \
      -f /home/$USER/.ssh/id_ed25519 \
      -N "" -C "$MODE@aziros"
  fi

  # Key auf lokalem Server eintragen:
  echo "→ SSH Key wird eingetragen..."
  sshpass -p "$LOCAL_PASS" ssh-copy-id \
    -i /home/$USER/.ssh/id_ed25519.pub \
    -o StrictHostKeyChecking=no \
    $LOCAL_USER@$LOCAL_IP

  # .env holen:
  echo "→ .env wird kopiert..."
  sudo -u $USER scp \
    -o StrictHostKeyChecking=no \
    $LOCAL_USER@$LOCAL_IP:~/aziros/src/$SRC_ENV \
    $ENV_FILE

  if [ ! -f "$ENV_FILE" ]; then
    echo "❌ .env konnte nicht geholt werden"
    exit 1
  fi

  echo "✅ .env kopiert"
fi
echo "✅ .env vorhanden"

# ═══════════════════════════════════════
# SCHRITT 8 — Compose File wählen
# ═══════════════════════════════════════
if [ "$MODE" = "development" ]; then
  COMPOSE="docker-compose.development.yml"
elif [ "$MODE" = "staging" ]; then
  COMPOSE="docker-compose.staging.yml"
else
  COMPOSE="docker-compose.yml"
fi

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

# Variablen für Docker Compose exportieren:
sudo -u $USER bash -c "
  set -a
  source /home/$USER/aziros/src/.env
  set +a
  cd /home/$USER/aziros
  docker compose -f $COMPOSE up -d --build
"

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

# ═══════════════════════════════════════
# SCHRITT 10 — DB User anlegen
# ═══════════════════════════════════════
echo "→ DB wird konfiguriert..."

DB_NAME=$(grep "^DB_DATABASE=" $ENV_FILE \
  | cut -d= -f2)
DB_USER=$(grep "^DB_USERNAME=" $ENV_FILE \
  | cut -d= -f2)
DB_PASS=$(grep "^DB_PASSWORD=" $ENV_FILE \
  | cut -d= -f2)
DB_ROOT=$(grep "^DB_ROOT_PASSWORD=" $ENV_FILE \
  | cut -d= -f2)

sudo -u $USER docker compose \
  -f $COMPOSE exec -T db \
  mariadb -u root -p"$DB_ROOT" \
  -e "
CREATE DATABASE IF NOT EXISTS \`$DB_NAME\`;
CREATE USER IF NOT EXISTS '$DB_USER'@'%'
  IDENTIFIED BY '$DB_PASS';
GRANT ALL PRIVILEGES ON \`$DB_NAME\`.*
  TO '$DB_USER'@'%';
FLUSH PRIVILEGES;
"
echo "✅ DB konfiguriert"

# ═══════════════════════════════════════
# SCHRITT 11 — Laravel Setup
# ═══════════════════════════════════════

echo "→ Verzeichnisse erstellen..."
sudo -u $USER docker compose \
  -f $COMPOSE exec -T app \
  mkdir -p \
  bootstrap/cache \
  storage/framework/cache \
  storage/framework/sessions \
  storage/framework/views \
  storage/logs

sudo -u $USER docker compose \
  -f $COMPOSE exec -T app \
  chmod -R 775 bootstrap/cache storage

echo "→ Composer install..."
sudo -u $USER docker compose \
  -f $COMPOSE exec -T app \
  composer install --no-dev \
  --optimize-autoloader

echo "→ Assets bauen..."
if [ "$MODE" = "staging" ]; then
  BUILD_CMD="npm run build:staging"
elif [ "$MODE" = "development" ]; then
  BUILD_CMD="npm run build"
else
  BUILD_CMD="npm run build:prod"
fi

echo "→ Migrationen..."
sudo -u $USER docker compose \
  -f $COMPOSE exec -T app \
  php artisan migrate --force

echo "→ Storage Link..."
sudo -u $USER docker compose \
  -f $COMPOSE exec -T app \
  php artisan storage:link

echo "→ Services neu starten..."
sudo -u $USER docker compose \
  -f $COMPOSE restart \
  worker mail-worker reverb scheduler

echo "→ Cache aufbauen..."
sudo -u $USER docker compose \
  -f $COMPOSE exec -T app \
  php artisan config:cache
sudo -u $USER docker compose \
  -f $COMPOSE exec -T app \
  php artisan route:cache
sudo -u $USER docker compose \
  -f $COMPOSE exec -T app \
  php artisan view:cache

echo "✅ Laravel konfiguriert"

# ═══════════════════════════════════════
# SCHRITT 12 — Status
# ═══════════════════════════════════════
echo ""
echo "╔══════════════════════════════════════╗"
echo "║      Setup abgeschlossen ✅           ║"
echo "╚══════════════════════════════════════╝"
echo ""

sudo -u $USER docker compose \
  -f $COMPOSE 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 aktiv:"
echo "  su - $USER"
echo ""
