name: Dynamic Branch Deploy
on: [push]

env:
  REGISTRY: git.zb-server.de
  # WICHTIG: Deine echte Haupt-Domain
  BASE_DOMAIN: escape-from-school.de

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
      # 1. Code auschecken
      - name: Checkout Code
        uses: actions/checkout@v3

      # 2. Variablen vorbereiten (MIT HAUPT-DOMAIN LOGIK)
      - name: Prepare Environment Variables
        id: prep
        run: |
          # 1. Repo und Branch Namen säubern
          # Voller Pfad für Docker Image (z.B. "user/escape-teacher")
          FULL_IMAGE_PATH=$(echo "${{ gitea.repository }}" | tr '[:upper:]' '[:lower:]')
          
          # Nur der Projektname für K8s (z.B. "escape-teacher")
          REPO_LOWER=$(echo "$FULL_IMAGE_PATH" | cut -d'/' -f2)
          
          # Branch Name säubern (Sonderzeichen zu Bindestrichen)
          BRANCH_LOWER=$(echo "${{ gitea.ref_name }}" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9-]/-/g')
          
          # 2. Logik: Ist es der Haupt-Branch?
          if [ "$BRANCH_LOWER" = "main" ] || [ "$BRANCH_LOWER" = "master" ]; then
            # PRODUKTION:
            # URL ist direkt die Domain (ohne Subdomain)
            APP_URL="${{ env.BASE_DOMAIN }}"
            # Namespace ist nur der Projektname (ohne Branch-Suffix)
            TARGET_NS="${REPO_LOWER}"
            echo "Mode: PRODUCTION (Root Domain)"
          else
            # ENTWICKLUNG:
            # URL ist repo-branch.domain.de
            APP_URL="${REPO_LOWER}-${BRANCH_LOWER}.${{ env.BASE_DOMAIN }}"
            # Namespace ist repo-branch
            TARGET_NS="${REPO_LOWER}-${BRANCH_LOWER}"
            echo "Mode: DEVELOPMENT (Subdomain)"
          fi
          
          # Image Tag (Commit Hash)
          IMAGE_TAG="${{ gitea.sha }}"

          # Debug Ausgabe
          echo "DEBUG: Branch: $BRANCH_LOWER"
          echo "DEBUG: Namespace: $TARGET_NS"
          echo "DEBUG: URL: $APP_URL"

          # In Gitea Actions Environment schreiben
          echo "FULL_IMAGE_PATH=$FULL_IMAGE_PATH" >> $GITHUB_ENV
          echo "REPO_NAME=$REPO_LOWER" >> $GITHUB_ENV
          echo "TARGET_NS=$TARGET_NS" >> $GITHUB_ENV
          echo "APP_URL=$APP_URL" >> $GITHUB_ENV
          echo "IMAGE_TAG=$IMAGE_TAG" >> $GITHUB_ENV

      # 3. Kaniko Build
      - name: Build and Push with Kaniko
        uses: aevea/action-kaniko@v0.12.0
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ gitea.actor }}
          password: ${{ secrets.PACKAGE_TOKEN }}
          image: ${{ env.FULL_IMAGE_PATH }}
          tag: ${{ env.IMAGE_TAG }}
          cache: true
          extra_args: --skip-tls-verify-pull --insecure

      # 4. Setup Kubectl (Interner Trick)
      - name: Setup Kubectl
        run: |
          curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
          chmod +x kubectl
          mv kubectl /usr/local/bin/

          mkdir -p $HOME/.kube
          echo "${{ secrets.KUBE_CONFIG }}" > $HOME/.kube/config
          chmod 600 $HOME/.kube/config
          
          # Internal DNS Trick (für Kommunikation innerhalb des Clusters)
          sed -i 's|server: https://.*:6443|server: https://kubernetes.default.svc:443|g' $HOME/.kube/config

      # 5. Deploy to Kubernetes
      - name: Deploy to Kubernetes
        run: |
          # Namespace erstellen (falls nicht existiert)
          kubectl create namespace ${{ env.TARGET_NS }} --dry-run=client -o yaml | kubectl apply -f -
          
          # Vollen Image Pfad bauen
          FULL_IMAGE_URL="${{ env.REGISTRY }}/${{ env.FULL_IMAGE_PATH }}:${{ env.IMAGE_TAG }}"
          
          # 1. Ingress anpassen (Hier wird die URL eingesetzt!)
          sed -i "s|\${APP_URL}|${{ env.APP_URL }}|g" k8s/ingress.yaml
          
          # 2. App Deployment anpassen (Image & Secrets)
          # Nutze Secrets oder Fallback-Werte
          ADMIN_USER="${{ secrets.ADMIN_USER || 'lehrer' }}"
          ADMIN_PASS="${{ secrets.ADMIN_PASS || 'geheim123' }}"
          
          sed -i "s|\${IMAGE_NAME}|$FULL_IMAGE_URL|g" k8s/app.yaml
          sed -i "s|\${ADMIN_USER}|$ADMIN_USER|g" k8s/app.yaml
          sed -i "s|\${ADMIN_PASS}|$ADMIN_PASS|g" k8s/app.yaml

          # Anwenden
          echo "Deploying Resources to Namespace: ${{ env.TARGET_NS }}"
          kubectl apply -f k8s/pvc.yaml -n ${{ env.TARGET_NS }}
          kubectl apply -f k8s/redis.yaml -n ${{ env.TARGET_NS }}
          kubectl apply -f k8s/app.yaml -n ${{ env.TARGET_NS }}
          kubectl apply -f k8s/ingress.yaml -n ${{ env.TARGET_NS }}
          
          # HPA (Autoscaling) nur für Main/Master Branch aktivieren
          # Wir vergleichen den Namespace mit dem Repo-Namen
          # Wenn Namespace == RepoName, dann sind wir im Main Branch
          if [ "${{ env.TARGET_NS }}" == "${{ env.REPO_NAME }}" ]; then
            echo "Main Branch detected: Applying HPA (Autoscaling)..."
            kubectl apply -f k8s/hpa.yaml -n ${{ env.TARGET_NS }}
          else
            echo "Feature Branch: Skipping HPA."
            # Optional: HPA löschen, falls es versehentlich da ist
            kubectl delete hpa escape-game-hpa -n ${{ env.TARGET_NS }} --ignore-not-found
          fi

          # Force Update (damit das neue Image sicher geladen wird)
          kubectl rollout restart deployment/escape-game -n ${{ env.TARGET_NS }}

      # 6. Summary
      - name: Summary
        run: echo "🚀 Deployed successfully to https://${{ env.APP_URL }}"