# This workflow will run to update the installer library of
# Docker images.  These are the images which provide updated wheels
# .deb installation packages or maybe just some compiled library

name: Build Image Library

on:
  push:
    # Must match one of these branches AND one of the paths
    # to be triggered
    branches:
      - "main"
      - "dev"
      - "library-*"
      - "feature-*"
    paths:
      # Trigger the workflow if a Dockerfile changed
      - "docker-builders/**"
      # Trigger if a package was updated
      - ".build-config.json"
      - "Pipfile.lock"
      # Also trigger on workflow changes related to the library
      - ".github/workflows/installer-library.yml"
      - ".github/workflows/reusable-workflow-builder.yml"
      - ".github/scripts/**"

# Set a workflow level concurrency group so primary workflow
# can wait for this to complete if needed
# DO NOT CHANGE without updating main workflow group
concurrency:
  group: build-installer-library
  cancel-in-progress: false

jobs:
  prepare-docker-build:
    name: Prepare Docker Image Version Data
    runs-on: ubuntu-22.04
    steps:
      -
        name: Set ghcr repository name
        id: set-ghcr-repository
        run: |
          ghcr_name=$(echo "${GITHUB_REPOSITORY}" | awk '{ print tolower($0) }')
          echo "repository=${ghcr_name}" >> $GITHUB_OUTPUT
      -
        name: Checkout
        uses: actions/checkout@v3
      -
        name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: "3.9"
      -
        name: Install jq
        run: |
          sudo apt-get update
          sudo apt-get install jq
      -
        name: Setup qpdf image
        id: qpdf-setup
        run: |
          build_json=$(python ${GITHUB_WORKSPACE}/.github/scripts/get-build-json.py qpdf)

          echo ${build_json}

          echo "qpdf-json=${build_json}" >> $GITHUB_OUTPUT
      -
        name: Setup psycopg2 image
        id: psycopg2-setup
        run: |
          build_json=$(python ${GITHUB_WORKSPACE}/.github/scripts/get-build-json.py psycopg2)

          echo ${build_json}

          echo "psycopg2-json=${build_json}" >> $GITHUB_OUTPUT
      -
        name: Setup pikepdf image
        id: pikepdf-setup
        run: |
          build_json=$(python ${GITHUB_WORKSPACE}/.github/scripts/get-build-json.py pikepdf)

          echo ${build_json}

          echo "pikepdf-json=${build_json}" >> $GITHUB_OUTPUT
      -
        name: Setup jbig2enc image
        id: jbig2enc-setup
        run: |
          build_json=$(python ${GITHUB_WORKSPACE}/.github/scripts/get-build-json.py jbig2enc)

          echo ${build_json}

          echo "jbig2enc-json=${build_json}" >> $GITHUB_OUTPUT
      -
        name: Setup other versions
        id: cache-bust-setup
        run: |
          pillow_version=$(jq ".default.pillow.version" Pipfile.lock | sed 's/=//g' | sed 's/"//g')
          lxml_version=$(jq ".default.lxml.version" Pipfile.lock | sed 's/=//g' | sed 's/"//g')

          echo "Pillow is ${pillow_version}"
          echo "lxml is ${lxml_version}"

          echo "pillow-version=${pillow_version}" >> $GITHUB_OUTPUT
          echo "lxml-version=${lxml_version}" >> $GITHUB_OUTPUT

    outputs:

      ghcr-repository: ${{ steps.set-ghcr-repository.outputs.repository }}

      qpdf-json: ${{ steps.qpdf-setup.outputs.qpdf-json }}

      pikepdf-json: ${{ steps.pikepdf-setup.outputs.pikepdf-json }}

      psycopg2-json: ${{ steps.psycopg2-setup.outputs.psycopg2-json }}

      jbig2enc-json: ${{ steps.jbig2enc-setup.outputs.jbig2enc-json }}

      pillow-version: ${{ steps.cache-bust-setup.outputs.pillow-version }}

      lxml-version: ${{ steps.cache-bust-setup.outputs.lxml-version }}

  build-qpdf-debs:
    name: qpdf
    needs:
      - prepare-docker-build
    uses: ./.github/workflows/reusable-workflow-builder.yml
    with:
      dockerfile: ./docker-builders/Dockerfile.qpdf
      build-platforms: linux/amd64
      build-json: ${{ needs.prepare-docker-build.outputs.qpdf-json }}
      build-args: |
        QPDF_VERSION=${{ fromJSON(needs.prepare-docker-build.outputs.qpdf-json).version }}

  build-jbig2enc:
    name: jbig2enc
    needs:
      - prepare-docker-build
    uses: ./.github/workflows/reusable-workflow-builder.yml
    with:
      dockerfile: ./docker-builders/Dockerfile.jbig2enc
      build-json: ${{ needs.prepare-docker-build.outputs.jbig2enc-json }}
      build-args: |
        JBIG2ENC_VERSION=${{ fromJSON(needs.prepare-docker-build.outputs.jbig2enc-json).version }}

  build-psycopg2-wheel:
    name: psycopg2
    needs:
      - prepare-docker-build
    uses: ./.github/workflows/reusable-workflow-builder.yml
    with:
      dockerfile: ./docker-builders/Dockerfile.psycopg2
      build-json: ${{ needs.prepare-docker-build.outputs.psycopg2-json }}
      build-args: |
        PSYCOPG2_VERSION=${{ fromJSON(needs.prepare-docker-build.outputs.psycopg2-json).version }}

  build-pikepdf-wheel:
    name: pikepdf
    needs:
      - prepare-docker-build
      - build-qpdf-debs
    uses: ./.github/workflows/reusable-workflow-builder.yml
    with:
      dockerfile: ./docker-builders/Dockerfile.pikepdf
      build-json: ${{ needs.prepare-docker-build.outputs.pikepdf-json }}
      build-args: |
        REPO=${{ needs.prepare-docker-build.outputs.ghcr-repository }}
        QPDF_VERSION=${{ fromJSON(needs.prepare-docker-build.outputs.qpdf-json).version }}
        PIKEPDF_VERSION=${{ fromJSON(needs.prepare-docker-build.outputs.pikepdf-json).version }}
        PILLOW_VERSION=${{ needs.prepare-docker-build.outputs.pillow-version }}
        LXML_VERSION=${{ needs.prepare-docker-build.outputs.lxml-version }}
