# Name des Workflows (erscheint im Actions-Tab auf GitHub)
name: Build and Deploy Ktor Server to Proxmox

# Trigger: Wann soll der Workflow starten?
on:
  # Bei jedem Push auf den 'main' Branch
  push:
    branches: [ main ]
  # Erlaubt auch das manuelle Starten über den Actions-Tab
  workflow_dispatch:

# Definition der auszuführenden Jobs
jobs:
  # Ein Job namens 'build-and-deploy' (Name ist frei wählbar)
  build-and-deploy:
    # Angezeigter Name für den Job auf GitHub
    name: Build and Deploy Ktor Server

    # WICHTIG: Dieser Job MUSS auf deinem selbst gehosteten Runner laufen!
    # Stelle sicher, dass die Labels hier (mindestens 'self-hosted')
    # mit den Labels deines Runners übereinstimmen.
    runs-on: self-hosted

    # Die Schritte, die in diesem Job ausgeführt werden
    steps:
      # Schritt 1: Code aus dem Repository holen
      # verwendet die Standard-Action von GitHub dafür
      - name: Check out repository code
        uses: actions/checkout@v4

      # Schritt 2: Docker Image für den Ktor-Server bauen
      # verwendet die 'Dockerfile' im Hauptverzeichnis des Projekts.
      # Taggt das Image als 'meldestelle/server: latest' (muss zum Compose-File passen)
      - name: Build Docker image
        # Führt 'docker build' im Root-Verzeichnis des ausgecheckten Codes aus
        run: docker build -t meldestelle/server:latest .

      # Schritt 3: Anwendung via Docker Compose starten/aktualisieren
      # stellt alle in docker-compose.yml definierten Services bereit
      - name: Deploy application via Docker Compose
        # Macht die GitHub Secrets als Umgebungsvariablen NUR für diesen Schritt verfügbar
        env:
          POSTGRES_USER: ${{ secrets.POSTGRES_USER }}
          POSTGRES_PASSWORD: ${{ secrets.POSTGRES_PASSWORD }}
          POSTGRES_DB: ${{ secrets.POSTGRES_DB }}
          # Füge hier optional weitere Secrets hinzu, die deine Compose-Datei braucht
          # z.B. PGADMIN_DEFAULT_PASSWORD: ${{ secrets.PGADMIN_PASSWORD }}
        # Führt 'docker compose up' aus.
        # Docker Compose liest die oben gesetzten ENV-Variablen und verwendet sie für die
        # Ersetzung von ${...} in der docker-compose.yml (z.B. für den 'db' Service).
        # Der 'server' Service bekommt seine DB-Variablen auch über die 'environment'-Sektion
        # in der docker-compose.yml, die ebenfalls diese ENV-Variablen nutzt.
        # --build: Baut Images neu, falls nötig (besonders wichtig für den 'server'-Service)
        # -d: Startet Container im Hintergrund
        # --force-recreate: Erzwingt Neuerstellung, kann helfen, alte Zustände zu vermeiden
        run: docker compose up --build -d --force-recreate