name: MoUI CI

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]
  workflow_dispatch:
    inputs:
      run_slow_native_examples:
        description: Build current-platform Skia native examples on macOS and Linux.
        required: false
        default: false
        type: boolean
jobs:
  moonbit-workspace-baseline:
    name: MoonBit workspace baseline
    runs-on: macos-14
    steps:
      - name: Checkout
        uses: actions/checkout@v5

      - name: Set up MoonBit
        uses: ./.github/actions/setup-moonbit

      - name: Install dependencies
        run: |
          moon version --all
          sh scripts/ci-moon-update.sh

      - name: Run MoonBit workspace baseline
        run: |
          moon check
          moon test
          moon info
          git diff --exit-code

  pr-profile:
    name: PR profile gate
    runs-on: macos-14
    steps:
      - name: Checkout
        uses: actions/checkout@v5

      - name: Set up MoonBit
        uses: ./.github/actions/setup-moonbit

      - name: Install dependencies
        run: |
          moon version --all
          sh scripts/ci-moon-update.sh

      - name: Run PR check profile
        run: sh scripts/check.sh --profile pr

  api-surface:
    name: Public API surface
    runs-on: macos-14
    steps:
      - name: Checkout
        uses: actions/checkout@v5

      - name: Set up MoonBit
        uses: ./.github/actions/setup-moonbit

      - name: Install dependencies
        run: |
          moon version --all
          sh scripts/ci-moon-update.sh

      - name:  moon info  public interface generation (all packages)
        run: |
          # Regenerate only MoUI-tracked packages; mooncakes deps (e.g. bobzhang/openseek) are not in git.
          # Skip vendored third_party modules whose package ids differ from filesystem paths.
          while IFS= read -r path; do
            case "$path" in
              third_party/*) continue ;;
            esac
            moon info -p "$path"
          done < <(git ls-files '**/pkg.generated.mbti' | sed 's|/pkg.generated.mbti$||')

      - name: Check generated interface drift
        run: git diff --exit-code -- '**/pkg.generated.mbti'

  linux-platform:
    name: Linux platform contracts
    runs-on: ubuntu-24.04
    steps:
      - name: Checkout
        uses: actions/checkout@v5

      - name: Install native Linux dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y \
            libwayland-dev libwayland-bin wayland-protocols pkg-config unzip \
            libfontconfig1-dev libfreetype-dev libharfbuzz-dev fonts-noto-color-emoji

      - name: Set up MoonBit
        uses: ./.github/actions/setup-moonbit

      - name: Install dependencies
        run: |
          moon version --all
          sh scripts/ci-moon-update.sh

      - name: Run Linux platform profile
        run: sh scripts/check.sh --profile platform

      - name: Build Linux native examples
        if: ${{ github.event_name == 'workflow_dispatch' && inputs.run_slow_native_examples }}
        run: |
          moon build examples/showcase/linux_skia --target native

  macos-packaging:
    name: macOS packaging smoke
    runs-on: macos-14
    steps:
      - name: Checkout
        uses: actions/checkout@v5

      - name: Set up MoonBit
        uses: ./.github/actions/setup-moonbit

      - name: Install dependencies
        run: |
          moon version --all
          sh scripts/ci-moon-update.sh

      - name: Package Showcase app bundle
        run: |
          sh scripts/package-macos-app.sh \
            --package examples/showcase/macos_skia \
            --name "MoUI Showcase" \
            --bundle-id dev.wzzc.moui.showcase \
            --version 0.1.0 \
            --build-version "$GITHUB_RUN_NUMBER"

      - name: Build macOS native examples
        if: ${{ github.event_name == 'workflow_dispatch' && inputs.run_slow_native_examples }}
        run: |
          moon build examples/showcase/macos_skia --target native
          moon build examples/markdown_editor/macos_skia --target native

      - name: Upload macOS package artifact
        uses: actions/upload-artifact@v4
        with:
          name: moui-showcase-macos-app
          path: dist/macos/MoUI Showcase.app
          if-no-files-found: error

  benchmark-scaffold:
    name: Benchmark scaffold
    runs-on: macos-14
    steps:
      - name: Checkout
        uses: actions/checkout@v5

      - name: Set up MoonBit
        uses: ./.github/actions/setup-moonbit

      - name: Install dependencies
        run: |
          moon version --all
          sh scripts/ci-moon-update.sh

      - name: Build benchmark targets
        run: node scripts/conformance-capture-scaffold.mjs --mode benchmark

      - name: Run performance budgets
        run: node scripts/run-performance-budgets.mjs

      - name: Upload performance report
        if: ${{ always() }}
        uses: actions/upload-artifact@v4
        with:
          name: moui-performance-budgets
          path: artifacts/performance/result.json
          if-no-files-found: error

  windows-native:
    name: Windows MSVC native smoke
    runs-on: windows-2022
    steps:
      - name: Checkout
        uses: actions/checkout@v5

      - name: Set up vcpkg zlib
        shell: pwsh
        run: powershell -ExecutionPolicy Bypass -File .\scripts\windows\setup_msvc_deps.ps1 -InstallZlib -InstallWebView2

      - name: Set up MoonBit
        uses: ./.github/actions/setup-moonbit

      - name: Install dependencies
        shell: bash
        run: |
          moon version --all
          sh scripts/ci-moon-update.sh

      - name: Verify Windows check wrapper plan
        shell: pwsh
        run: powershell -ExecutionPolicy Bypass -File .\scripts\windows\check.ps1 -Profile Pr -DryRun -Json -SkipSubmoduleInit

      - name: Run Windows backend tests
        shell: pwsh
        run: |
          . .\scripts\windows\msvc_env.ps1
          moon test moui/backend/windows --target native
          Enable-MsvcC11Atomics
          moon check examples/showcase/windows_skia --target native

      - name: Build Showcase Windows Skia entrypoint with MSVC
        shell: pwsh
        run: powershell -ExecutionPolicy Bypass -File .\scripts\windows\build_windows_msvc.ps1 -Package examples/showcase/windows_skia -BuildOnly

      - name: Package Showcase Windows Skia folder with MSVC
        shell: pwsh
        run: |
          powershell -ExecutionPolicy Bypass -File .\scripts\windows\package_windows_app_msvc.ps1 `
            -Package examples/showcase/windows_skia `
            -AppName MoUIShowcase `
            -Version 0.1.0 `
            -BuildNumber $env:GITHUB_RUN_NUMBER

      - name: Upload Windows package artifact
        uses: actions/upload-artifact@v4
        with:
          name: moui-showcase-windows-msvc-portable
          path: dist/windows-msvc/MoUIShowcase
          if-no-files-found: error