name: Build AIO Base Image

on:
  workflow_dispatch:
    inputs:
      base_tag_name:
        description: 'Base Tag Name'
        required: false
        default: ''

env:
  TARGET_BRANCH: ${{ github.ref_name }}

jobs:
  base_build_setup:
    name: Build Preparation
    runs-on: ubuntu-latest
    outputs:
      gh_branch_name: ${{ steps.set_env_variables.outputs.TARGET_BRANCH }}
      gh_buildx_driver: ${{ steps.set_env_variables.outputs.BUILDX_DRIVER }}
      gh_buildx_version: ${{ steps.set_env_variables.outputs.BUILDX_VERSION }}
      gh_buildx_platforms: ${{ steps.set_env_variables.outputs.BUILDX_PLATFORMS }}
      gh_buildx_endpoint: ${{ steps.set_env_variables.outputs.BUILDX_ENDPOINT }}
      image_tag: ${{ steps.set_env_variables.outputs.IMAGE_TAG }}

    steps:
      - id: set_env_variables
        name: Set Environment Variables
        run: |
          echo "TARGET_BRANCH=${{ env.TARGET_BRANCH }}" >> $GITHUB_OUTPUT

          if [ "${{ github.event.inputs.base_tag_name }}" != "" ]; then
            echo "IMAGE_TAG=${{ github.event.inputs.base_tag_name }}" >> $GITHUB_OUTPUT
          elif [ "${{ env.TARGET_BRANCH }}" == "master" ]; then
            echo "IMAGE_TAG=latest" >> $GITHUB_OUTPUT
          elif [ "${{ env.TARGET_BRANCH }}" == "preview" ]; then
              echo "IMAGE_TAG=preview" >> $GITHUB_OUTPUT
          else
            echo "IMAGE_TAG=develop" >> $GITHUB_OUTPUT
          fi


          if [ "${{ env.TARGET_BRANCH }}" == "master" ]; then
            echo "BUILDX_DRIVER=cloud" >> $GITHUB_OUTPUT
            echo "BUILDX_VERSION=lab:latest" >> $GITHUB_OUTPUT
            echo "BUILDX_PLATFORMS=linux/amd64,linux/arm64" >> $GITHUB_OUTPUT
            echo "BUILDX_ENDPOINT=makeplane/plane-dev" >> $GITHUB_OUTPUT
          else
            echo "BUILDX_DRIVER=docker-container" >> $GITHUB_OUTPUT
            echo "BUILDX_VERSION=latest" >> $GITHUB_OUTPUT
            echo "BUILDX_PLATFORMS=linux/amd64" >> $GITHUB_OUTPUT
            echo "BUILDX_ENDPOINT=" >> $GITHUB_OUTPUT
          fi

      - id: checkout_files
        name: Checkout Files
        uses: actions/checkout@v4

  full_base_build_push:
    runs-on: ubuntu-latest
    needs: [base_build_setup]
    env:
      BASE_IMG_TAG: makeplane/plane-aio-base:full-${{ needs.base_build_setup.outputs.image_tag }}
      BUILDX_DRIVER: ${{ needs.base_build_setup.outputs.gh_buildx_driver }}
      BUILDX_VERSION: ${{ needs.base_build_setup.outputs.gh_buildx_version }}
      BUILDX_PLATFORMS: ${{ needs.base_build_setup.outputs.gh_buildx_platforms }}
      BUILDX_ENDPOINT: ${{ needs.base_build_setup.outputs.gh_buildx_endpoint }}
    steps:
      - name: Check out the repo
        uses: actions/checkout@v4

      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
        with:
          driver: ${{ env.BUILDX_DRIVER }}
          version: ${{ env.BUILDX_VERSION }}
          endpoint: ${{ env.BUILDX_ENDPOINT }}

      - name: Build and Push to Docker Hub
        uses: docker/build-push-action@v5.1.0
        with:
          context: ./aio
          file: ./aio/Dockerfile-base-full
          platforms: ${{ env.BUILDX_PLATFORMS }}
          tags: ${{ env.BASE_IMG_TAG }}
          push: true
          cache-from: type=gha
          cache-to: type=gha,mode=max
        env:
          DOCKER_BUILDKIT: 1
          DOCKER_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
          DOCKER_PASSWORD: ${{ secrets.DOCKERHUB_TOKEN }}

  slim_base_build_push:
    runs-on: ubuntu-latest
    needs: [base_build_setup]
    env:
      BASE_IMG_TAG: makeplane/plane-aio-base:slim-${{ needs.base_build_setup.outputs.image_tag }}
      BUILDX_DRIVER: ${{ needs.base_build_setup.outputs.gh_buildx_driver }}
      BUILDX_VERSION: ${{ needs.base_build_setup.outputs.gh_buildx_version }}
      BUILDX_PLATFORMS: ${{ needs.base_build_setup.outputs.gh_buildx_platforms }}
      BUILDX_ENDPOINT: ${{ needs.base_build_setup.outputs.gh_buildx_endpoint }}
    steps:
      - name: Check out the repo
        uses: actions/checkout@v4

      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
        with:
          driver: ${{ env.BUILDX_DRIVER }}
          version: ${{ env.BUILDX_VERSION }}
          endpoint: ${{ env.BUILDX_ENDPOINT }}

      - name: Build and Push to Docker Hub
        uses: docker/build-push-action@v5.1.0
        with:
          context: ./aio
          file: ./aio/Dockerfile-base-slim
          platforms: ${{ env.BUILDX_PLATFORMS }}
          tags: ${{ env.BASE_IMG_TAG }}
          push: true
          cache-from: type=gha
          cache-to: type=gha,mode=max
        env:
          DOCKER_BUILDKIT: 1
          DOCKER_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
          DOCKER_PASSWORD: ${{ secrets.DOCKERHUB_TOKEN }}
