name: Build, Test & Push Frontend
run-name: ${{ gitea.actor }} build and test Angular 🚀

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  # ------------------------------------------------------------------
  # JOB 1: Code integrity and quality gates (CI)
    # ------------------------------------------------------------------
  quality-check:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Code
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '22'
          cache: 'npm'

      - name: Install Linux Libs
        run: |
          sudo apt-get update
          sudo apt-get install -y \
            libnss3 \
            libnspr4 \
            libatk1.0-0 \
            libatk-bridge2.0-0 \
            libcups2t64 \
            libdrm2 \
            libxkbcommon0 \
            libxcomposite1 \
            libxdamage1 \
            libxfixes3 \
            libxrandr2 \
            libgbm1 \
            libasound2t64 \
            libpango-1.0-0 \
            libcairo2

      - name: Install Dependencies
        run: npm ci

      # 1. Linting (Code-Style)
      - name: Lint & Type Check
        run: npm run lint --if-present

      # 2. Unit Tests (Logik) Not necessary, because atm no tests written
      #- name: Unit Tests
      #  run: npx ng test --watch=false --browsers=ChromeHeadless

      # 3. Build Production (necessary for lighthouse)      
      - name: Build Production
        run: npx ng build --configuration production

      # 4. Lighthouse Audit (Performance & SEO)
      - name: Install Puppeteer
        run: npm install puppeteer --no-save
      
      - name: Lighthouse CI
        run: |
          CHROME_PATH=$(node -e 'console.log(require("puppeteer").executablePath())')                    
          export CHROME_PATH=$CHROME_PATH                    
          npx lhci autorun

  # ------------------------------------------------------------------
  # JOB 2: Docker Build & Push (CD)
  # Runs only if 'quality-check' are successfully and we are on branch main.
  # ------------------------------------------------------------------
  docker:
    needs: quality-check
    runs-on: ubuntu-latest
    if: github.event_name == 'push' && github.ref == 'refs/heads/main'

    steps:
      - uses: actions/checkout@v4

      - name: Prepare tag (sanitize branch)
        id: prep
        shell: bash
        run: |
          BRANCH="${GITHUB_REF_NAME}"
          BRANCH="${BRANCH//\//-}"
          BRANCH="$(echo "$BRANCH" | tr '[:upper:]' '[:lower:]')"
          echo "branch=$BRANCH" >> "$GITHUB_OUTPUT"
          echo "sha=${GITHUB_SHA::12}" >> "$GITHUB_OUTPUT"

      - uses: docker/setup-buildx-action@v3

      - uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: Build & Push (branch + sha tags)
        uses: docker/build-push-action@v6
        with:
          context: .
          push: true
          tags: |
            docker.io/${{ secrets.DOCKERHUB_USERNAME }}/playground:frontend-a-${{ steps.prep.outputs.branch }}
            docker.io/${{ secrets.DOCKERHUB_USERNAME }}/playground:frontend-a-${{ steps.prep.outputs.branch }}-${{ steps.prep.outputs.sha }}

      - name: Also push moving main tag
        uses: docker/build-push-action@v6
        with:
          context: .
          push: true
          tags: |
            docker.io/${{ secrets.DOCKERHUB_USERNAME }}/playground:frontend-a-main
