name: CI for Windows
# https://github.com/google/mozc/blob/master/docs/build_mozc_in_windows.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_x64:
    # https://github.com/actions/runner-images/blob/main/images/windows/Windows2025-Readme.md
    runs-on: windows-2025
    timeout-minutes: 120

    steps:
      - name: Checkout
        uses: actions/checkout@v6
        with:
          submodules: recursive
          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
        shell: cmd
        working-directory: .\src
        # This command uses src/third_party_cache as the download cache.
        run: |
          python build_tools/update_deps.py

      - name: Build Qt
        shell: cmd
        working-directory: .\src
        run: |
          python build_tools/build_qt.py --release --confirm_license

      # This is needed only for GitHub Actions where free disk space is quite limited.
      - name: Delete Qt src to save disk space
        shell: cmd
        working-directory: .\src
        run: |
          rmdir third_party\qt_src /s /q

      - name: build artifacts
        shell: cmd
        working-directory: .\src
        env:
          ANDROID_NDK_HOME: ""
        run: |
          bazelisk build --config oss_windows --config release_build package

      - name: upload Mozc64_x64.msi
        uses: actions/upload-artifact@v6
        with:
          name: Mozc64_x64.msi
          path: src/bazel-bin/win32/installer/Mozc64.msi
          if-no-files-found: warn

  build_arm64:
    # https://github.com/actions/runner-images/blob/main/images/windows/Windows2025-Readme.md
    runs-on: windows-2025
    timeout-minutes: 120

    steps:
      - name: Checkout
        uses: actions/checkout@v6
        with:
          submodules: recursive
          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
        shell: cmd
        working-directory: .\src
        # This command uses src/third_party_cache as the download cache.
        run: |
          python build_tools/update_deps.py

      - name: Build Qt (arm64)
        shell: cmd
        working-directory: .\src
        run: |
          python build_tools/build_qt.py --release --confirm_license --target_arch=arm64

      # This is needed only for GitHub Actions where free disk space is quite limited.
      - name: Delete Qt src to save disk space
        shell: cmd
        working-directory: .\src
        run: |
          rmdir third_party\qt_src /s /q

      - name: build artifacts
        shell: cmd
        working-directory: .\src
        env:
          ANDROID_NDK_HOME: ""
        run: |
          bazelisk build package --config oss_windows --config release_build --platforms=//:windows-arm64

      - name: upload Mozc64_arm64.msi
        uses: actions/upload-artifact@v6
        with:
          name: Mozc64_arm64.msi
          path: src/bazel-bin/win32/installer/Mozc64.msi
          if-no-files-found: warn

  test:
    # https://github.com/actions/runner-images/blob/main/images/windows/Windows2025-Readme.md
    runs-on: windows-2025
    timeout-minutes: 120

    steps:
      - name: Checkout
        uses: actions/checkout@v6
        with:
          submodules: recursive
          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
        shell: cmd
        working-directory: .\src
        # This command uses src/third_party_cache as the download cache.
        run: |
          python build_tools/update_deps.py

      - name: runtests
        shell: cmd
        working-directory: .\src
        env:
          ANDROID_NDK_HOME: ""
        run: |
          bazelisk test ... --config oss_windows -c dbg --build_tests_only

  # 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/windows/Windows2025-Readme.md
    runs-on: windows-2025
    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
        shell: cmd
        working-directory: .\src
        # This command uses src/third_party_cache as the download cache.
        run: |
          python build_tools/update_deps.py --cache_only
