name: docker-buildx
on:
  pull_request:
    branches:
      - master
      - experimental
  push:
    branches:
      - '**'
    tags:
      - '*.*'

jobs:
  test:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [18.x]

    services:
       mariadb:
          image: mariadb:lts
          ports:
            - 3306
          env:
            MYSQL_USER: user
            MYSQL_PASSWORD: password
            MYSQL_DATABASE: pigallery_test
            MYSQL_ROOT_PASSWORD: password
          options: --health-cmd="mysqladmin ping" --health-interval=5s --health-timeout=2s --health-retries=3


    steps:
    - uses: actions/checkout@v3
    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v3
      with:
        node-version: ${{ matrix.node-version }}

    - name: Verify MariaDB connection
      env:
        PORT: ${{ job.services.mariadb.ports[3306] }}
      run: |
        while ! mysqladmin ping -h"127.0.0.1" -P"$PORT" --silent; do
          sleep 1
        done

    - name: npm install and build
      run: |
        npm ci
        npm run build

    - name: lint
      run: |
        npm run lint
    - name: test
      run: |
        npm test
        npm run coverage
      env:
        MYSQL_HOST: localhost
        MYSQL_USERNAME: root
        MYSQL_PASSWORD: password
        MYSQL_PORT: ${{ job.services.mariadb.ports[3306] }}
        PORT: 35000
        CI: true
    - name: Coveralls
      uses: coverallsapp/github-action@v2
    - name: E2E test - Cypress run
      uses: cypress-io/github-action@v6
      env:
        DEBUG: '@cypress/github-action'
      with:
        start: npm run start-e2e-server
      # after the test run completes store screenshots
    - uses: actions/upload-artifact@v3
      if: failure() # Store screenshots only on failures
      with:
         name: cypress-screenshots
         path: test/cypress/screenshots
         if-no-files-found: ignore # 'warn' or 'error' are also available, defaults to `warn`

  create-release:
    runs-on: [ubuntu-latest]
    needs: [test]
    steps:
      -
        name: Checkout
        uses: actions/checkout@v3
      -
        name: Setup Node.js for use with actions
        uses: actions/setup-node@v3
        with:
          node-version: 18
      -
        name: Install Deps
        run: npm install --unsafe-perm
      -
        name: Create Release
        run: npm run create-release -- --skip-opt-packages=ffmpeg-static,ffprobe-static --force-opt-packages
      - uses: actions/upload-artifact@v3
        with:
          name: pigallery2-release
          path: release
  build-dockerx:
    runs-on: [ ubuntu-latest ]
    needs: [ create-release ]
    strategy:
      matrix:
        container: [alpine, debian-buster, debian-bullseye ]
        include:
          - container: alpine
            platforms: linux/amd64,linux/arm64,linux/arm/v7
          - container: debian-buster
            platforms: linux/amd64,linux/arm64,linux/arm/v7
          - container: debian-bullseye
            platforms: linux/amd64,linux/arm64,linux/arm/v7

    steps:
      - name: Checkout
        uses: actions/checkout@v3
      - uses: actions/download-artifact@v3
        with:
          name: pigallery2-release
          path: pigallery2-release
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v2
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2
      - name: Login to DockerHub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.REGISTRY_USERNAME }}
          password: ${{ secrets.REGISTRY_PASSWORD }}
      - name: Build docker
        uses: docker/build-push-action@v3
        with:
          context: .
          file: docker/${{ matrix.container }}/Dockerfile.build
          platforms: ${{ matrix.platforms }}
      - name: Push experimental
        if: ${{ github.ref == 'refs/heads/experimental' }}
        uses: docker/build-push-action@v3
        with:
          context: .
          file: docker/${{ matrix.container }}/Dockerfile.build
          platforms: ${{ matrix.platforms }}
          push: true
          tags: bpatrik/pigallery2:experimental-${{ matrix.container }}
      - name: Push edge on new master commit
        # github.ref:  branches the format is refs/heads/<branch_name>  PRs and Tags are different
        if: ${{github.ref == 'refs/heads/master' }}
        uses: docker/build-push-action@v3
        with:
          context: .
          file: docker/${{ matrix.container }}/Dockerfile.build
          platforms: ${{ matrix.platforms }}
          push: true
          tags: bpatrik/pigallery2:edge-${{ matrix.container }}
      - name: Push release on new Tag
        if: ${{ startsWith(github.ref_type , 'tag') &&  !github.event.issue.pull_request &&  matrix.container != 'debian-bullseye'}}
        uses: docker/build-push-action@v3
        with:
          context: .
          file: docker/${{ matrix.container }}/Dockerfile.build
          platforms: ${{ matrix.platforms }}
          push: true
          tags: |
            bpatrik/pigallery2:edge-${{ matrix.container }}
            bpatrik/pigallery2:${{ github.ref_name }}-${{ matrix.container }}
            bpatrik/pigallery2:latest-${{ matrix.container }}
      - name: Push latest on new Tag
        if: ${{ startsWith(github.ref_type, 'tag') &&  !github.event.issue.pull_request &&  matrix.container == 'debian-bullseye'}}
        uses: docker/build-push-action@v3
        with:
          context: .
          file: docker/${{ matrix.container }}/Dockerfile.build
          platforms: ${{ matrix.platforms }}
          push: true
          tags: |
            bpatrik/pigallery2:edge-${{ matrix.container }}
            bpatrik/pigallery2:${{ github.ref_name }}-${{ matrix.container }}
            bpatrik/pigallery2:latest-${{ matrix.container }}
            bpatrik/pigallery2:${{ github.ref_name }}
            bpatrik/pigallery2:latest