name: Build CI

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main
  workflow_dispatch:
    inputs:
      clear-cache:
        description: 'Clear docker cache before running'
        type: boolean
        default: false
  workflow_call:
    inputs:
      upload-build-artifact:
        required: true
        type: boolean
        default: true

jobs:
  clang-format-job:
    name: Run clang-format test
    uses: ./.github/workflows/clang_format_ci_workflow.yml

  unit-tests-job:
    name: Run unit tests
    uses: ./.github/workflows/unit_tests_ci_workflow.yml

  build:
    name: Build ROM
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v6

      - name: Get docker image cache
        uses: actions/cache@v5
        with:
          path: /tmp/docker-cache
          key: docker-images-${{ hashFiles('docker-compose.yml') }}

      - name: Clear docker cache (if requested)
        if: github.event.inputs.clear-cache == 'true'
        run: |
          echo "Clearing Docker cache..."
          rm -rf /tmp/docker-cache
          echo "Docker cache cleared"

      - name: Load or pull images
        run: |
          if [ -f /tmp/docker-cache/gbalatro.tar ]; then
            echo "Loading Image"
            docker load -i /tmp/docker-cache/gbalatro.tar
          else
            echo "Pulling Image"
            docker compose build gbalatro
            mkdir -p /tmp/docker-cache
            docker save $(docker compose config | grep image: | awk '{print $2}') -o /tmp/docker-cache/gbalatro.tar
          fi

      - name: Export UID/GID for Compose
        run: |
          echo "UID=$(id -u)" >> "$GITHUB_ENV"
          echo "GID=$(id -g)" >> "$GITHUB_ENV"

      - name: Build the project
        run: docker compose -f docker-compose.yml run --rm gbalatro sh -c "make -j$(nproc) && ./scripts/get_memory_map.sh"

      - name: 'Upload Artifact'
        if: ${{ inputs.upload-build-artifact }}
        uses: actions/upload-artifact@v6
        with:
          name: build-out
          path: build
          retention-days: 5
