# Copyright 2021 SkyWater PDK Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# SPDX-License-Identifier: Apache 2.0

name: Build Docker Image for Run DRC for cell GDS (using Magic) Action

on:
  workflow_dispatch:
  push:
  pull_request_target:

jobs:
  # FIXME: Remove once GitHub Container Registry is working.
  # docker.pkg.github.com doesn't support buildx built packages, use
  # docker/build-push-action instead.
  build-github-package:
    name: "Building Docker GitHub Package."

    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v2
      with:
        # Always clone the full depth so git-describe works.
        fetch-depth: 0
        submodules: true

    - name: Set Action Name
      run: echo "ACTION_NAME=run-drc-for-cell-gds-using-magic" >> $GITHUB_ENV

    - name: Build container image
      uses: docker/build-push-action@v1
      with:
        registry: docker.pkg.github.com
        username: ${{ github.repository_owner }}
        password: ${{ github.token }}
        repository: ${{ github.repository }}/${{ env.ACTION_NAME }}
        path: ${{ env.ACTION_NAME }}
        tag_with_ref: true
        tag_with_sha: true
        add_git_labels: true
        push: true


  build-docker-image:
    name: "Building image."

    runs-on: ubuntu-latest

    # Run a local registry
    services:
      registry:
        image: registry:2
        ports:
          - 5000:5000

    steps:
    - name: Checkout code
      uses: actions/checkout@v2
      with:
        # Always clone the full depth so git-describe works.
        fetch-depth: 0
        submodules: true

    - name: Set Action Name
      run: echo "ACTION_NAME=run-drc-for-cell-gds-using-magic" >> $GITHUB_ENV

    - name: Detect Push To Config
      id: push_to
      shell: python
      env:
        HAS_GCR_JSON_KEY: ${{ !!(secrets.GCR_JSON_KEY) }}
      run: |
        import os
        gh_event = os.environ['GITHUB_EVENT_NAME']

        i = []
        print("Adding local service.")
        i.append("localhost:5000/${{ env.ACTION_NAME }}")

        if "${{ env.HAS_GCR_JSON_KEY }}":
            print("Adding Google Container Repository (gcr.io)")
            i.append("gcr.io/skywater-pdk/actions/${{ env.ACTION_NAME }}")

        #print("Adding GitHub Container Repository (ghcr.io)")
        #i.append("ghcr.io/${{ github.repository }}/${{ env.ACTION_NAME }}")

        l = ",".join(i)
        print("Final locations:", repr(l))
        print("::set-output name=images::{}".format(l))

    - name: Docker meta
      id: docker_meta
      uses: docker/metadata-action@v3
      with:
        images: ${{ steps.push_to.outputs.images }}
        tags: |
          type=ref,event=tag
          type=ref,event=pr
          type=ref,event=branch
          type=sha
          type=sha,format=long

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

    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@v1
      with:
        driver-opts: network=host

    - name: Login to Google Container Registry
      if: ${{ contains(steps.push_to.outputs.images, 'gcr.io') }}
      uses: docker/login-action@v1
      with:
        registry: gcr.io
        username: _json_key
        password: ${{ secrets.GCR_JSON_KEY }}

    - name: Login to GitHub Container Registry
      if: ${{ contains(steps.push_to.outputs.images, 'ghcr.io') }}
      uses: docker/login-action@v1
      with:
        username: ${{ github.repository_owner }}
        password: ${{ github.token }}
        registry: ghcr.io

    - name: Build and push
      uses: docker/build-push-action@v2
      id: docker_build
      with:
        context: ${{ env.ACTION_NAME }}
        file: ${{ env.ACTION_NAME }}/Dockerfile
        push: true
        tags: |
          ${{ steps.docker_meta.outputs.tags }}
          localhost:5000/${{ env.ACTION_NAME }}:latest
        labels: ${{ steps.docker_meta.outputs.labels }}

    - name: Inspect
      run: docker buildx imagetools inspect localhost:5000/${{ env.ACTION_NAME }}:latest

    - name: Image digest
      run: echo ${{ steps.docker_build.outputs.digest }}
