name: Build and Push Docker Images

on:
  push:
    branches:
      - main
    tags:
      - 'v*.*.*'
  pull_request:
    branches:
      - main

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Set up Go
        uses: actions/setup-go@v4
        with:
          go-version: 1.22

      - name: Install mupdf
        run: sudo apt-get install -y mupdf

      - name: Set library path
        run: echo "/usr/lib" | sudo tee -a /etc/ld.so.conf.d/mupdf.conf && sudo ldconfig

      - name: Install dependencies
        run: go mod download

      - name: Run Go tests
        run: go test ./...

      - name: Set up Node.js
        uses: actions/setup-node@v3
        with:
          node-version: 20

      - name: Cache npm dependencies
        uses: actions/cache@v3
        with:
          path: ~/.npm
          key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
          restore-keys: |
            ${{ runner.os }}-node-

      - name: Install frontend dependencies
        run: npm install
        working-directory: web-app

      - name: Run frontend tests
        run: npm test
        working-directory: web-app

  build-and-push:
    runs-on: ubuntu-latest
    needs: test
    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2

      - name: Log in to Docker Hub
        if: ${{ github.event_name != 'pull_request' }}
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v2

      - name: Set Docker tags
        id: set_tags
        run: |
          echo "TAGS=icereed/paperless-gpt:unreleased" >> $GITHUB_ENV
          if [[ "${GITHUB_REF}" == "refs/heads/main" ]]; then
            echo "TAGS=icereed/paperless-gpt:unreleased" >> $GITHUB_ENV
          elif [[ "${GITHUB_REF_TYPE}" == "tag" ]]; then
            VERSION=${GITHUB_REF#refs/tags/}
            echo "TAGS=icereed/paperless-gpt:latest,icereed/paperless-gpt:${VERSION}" >> $GITHUB_ENV
          fi

      - name: Build and push Docker images
        id: docker_build
        uses: docker/build-push-action@v4
        with:
          context: .
          platforms: linux/amd64,linux/arm64
          push: ${{ github.event_name != 'pull_request' }}
          cache-from: type=gha
          cache-to: type=gha,mode=max
          tags: ${{ env.TAGS }}