name: CI for macOS
# https://github.com/google/mozc/blob/master/docs/build_mozc_in_osx.md

# Run on push.
on: push

permissions:
  contents: read

# Prevent previous workflows from running.
concurrency:
  group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}
  cancel-in-progress: true

jobs:
  build_arm64:
    # https://github.com/actions/runner-images/blob/main/images/macos/macos-15-arm64-Readme.md
    runs-on: macos-15
    timeout-minutes: 60

    steps:
      - name: checkout
        uses: actions/checkout@v6
        with:
          submodules: false
          persist-credentials: false

      - name: Try to restore update_deps cache
        uses: actions/cache@v5
        with:
          path: src/third_party_cache
          key: update_deps-${{ runner.os }}-${{ hashFiles('src/build_tools/update_deps.py') }}

      - name: Install dependencies
        working-directory: ./src
        # This command uses src/third_party_cache as the download cache.
        run: |
          python3 build_tools/update_deps.py

      - name: Build Qt
        working-directory: ./src
        run: |
          python3 build_tools/build_qt.py --release --confirm_license --macos_cpus=arm64
          echo "MOZC_QT_PATH=${PWD}/third_party/qt" >> $GITHUB_ENV

      - name: bazel build
        working-directory: ./src
        run: |
          bazelisk build --config oss_macos package --macos_cpus=arm64 --config release_build

      - name: upload artifacts
        uses: actions/upload-artifact@v6
        with:
          name: Mozc_arm64.pkg
          path: src/bazel-bin/mac/Mozc.pkg
          if-no-files-found: warn

  build_intel64:
    # https://github.com/actions/runner-images/blob/main/images/macos/macos-15-arm64-Readme.md
    runs-on: macos-15
    timeout-minutes: 60

    steps:
      - name: checkout
        uses: actions/checkout@v6
        with:
          submodules: false
          persist-credentials: false

      - name: Try to restore update_deps cache
        uses: actions/cache@v5
        with:
          path: src/third_party_cache
          key: update_deps-${{ runner.os }}-${{ hashFiles('src/build_tools/update_deps.py') }}

      - name: Install dependencies
        working-directory: ./src
        # This command uses src/third_party_cache as the download cache.
        run: |
          python3 build_tools/update_deps.py

      - name: Build Qt
        working-directory: ./src
        run: |
          python3 build_tools/build_qt.py --release --confirm_license --macos_cpus=x86_64
          echo "MOZC_QT_PATH=${PWD}/third_party/qt" >> $GITHUB_ENV

      - name: bazel build
        working-directory: ./src
        run: |
          bazelisk build --config oss_macos package --macos_cpus=x86_64 --config release_build

      - name: upload artifacts
        uses: actions/upload-artifact@v6
        with:
          name: Mozc_intel64.pkg
          path: src/bazel-bin/mac/Mozc.pkg
          if-no-files-found: warn

  build_universal_binary:
    # https://github.com/actions/runner-images/blob/main/images/macos/macos-15-arm64-Readme.md
    runs-on: macos-15
    timeout-minutes: 90

    steps:
      - name: checkout
        uses: actions/checkout@v6
        with:
          submodules: false
          persist-credentials: false

      - name: Try to restore update_deps cache
        uses: actions/cache@v5
        with:
          path: src/third_party_cache
          key: update_deps-${{ runner.os }}-${{ hashFiles('src/build_tools/update_deps.py') }}

      - name: Install dependencies
        working-directory: ./src
        # This command uses src/third_party_cache as the download cache.
        run: |
          python3 build_tools/update_deps.py

      - name: Build Qt
        working-directory: ./src
        run: |
          python3 build_tools/build_qt.py --release --confirm_license --macos_cpus=x86_64,arm64
          echo "MOZC_QT_PATH=${PWD}/third_party/qt" >> $GITHUB_ENV

      - name: bazel build
        working-directory: ./src
        run: |
          bazelisk build --config oss_macos package --macos_cpus=x86_64,arm64 --config release_build

      - name: upload artifacts
        uses: actions/upload-artifact@v6
        with:
          name: Mozc_universal_binary.pkg
          path: src/bazel-bin/mac/Mozc.pkg
          if-no-files-found: warn

  test:
    # https://github.com/actions/runner-images/blob/main/images/macos/macos-15-arm64-Readme.md
    runs-on: macos-15
    timeout-minutes: 60

    steps:
      - name: checkout
        uses: actions/checkout@v6
        with:
          submodules: false
          persist-credentials: false

      - name: Try to restore update_deps cache
        uses: actions/cache@v5
        with:
          path: src/third_party_cache
          key: update_deps-${{ runner.os }}-${{ hashFiles('src/build_tools/update_deps.py') }}

      - name: Install dependencies
        working-directory: ./src
        # This command uses src/third_party_cache as the download cache.
        run: |
          python3 build_tools/update_deps.py

      - name: bazel test
        working-directory: ./src
        run: |
          bazelisk test ... --config oss_macos --build_tests_only -c dbg

  # actions/cache works without this job, but having this would increase the likelihood of cache hit
  # in other jobs. Another approach would be to use "needs:".
  # https://docs.github.com/en/actions/using-jobs/using-jobs-in-a-workflow
  cache_deps:
    # https://github.com/actions/runner-images/blob/main/images/macos/macos-15-arm64-Readme.md
    runs-on: macos-15
    timeout-minutes: 15

    steps:
      - name: checkout
        uses: actions/checkout@v6
        with:
          submodules: false
          persist-credentials: false

      - name: Try to restore update_deps cache
        uses: actions/cache@v5
        with:
          path: src/third_party_cache
          key: update_deps-${{ runner.os }}-${{ hashFiles('src/build_tools/update_deps.py') }}

      - name: Install dependencies
        working-directory: ./src
        # This command uses src/third_party_cache as the download cache.
        run: |
          python3 build_tools/update_deps.py --cache_only
