name: CI
on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main
  merge_group:
    types:
      - checks_requested

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  lint:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2

      - name: Setup
        uses: ./.github/actions/setup

      - name: Lint files
        run: yarn lint

      - name: Typecheck files
        run: yarn typecheck

  test:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2

      - name: Setup
        uses: ./.github/actions/setup

      - name: Run unit tests
        run: yarn test --maxWorkers=2 --coverage

  build-library:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2

      - name: Setup
        uses: ./.github/actions/setup

      - name: Build package
        run: yarn prepare

<% if (project.native) { -%>
  build-android:
    runs-on: ubuntu-latest

    env:
      TURBO_CACHE_DIR: .turbo/android

    steps:
      - name: Checkout
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2

      - name: Setup
        uses: ./.github/actions/setup
<% if (project.moduleConfig === 'nitro-modules' || project.viewConfig === 'nitro-view') { -%>

      - name: Generate nitrogen code
        run: yarn nitrogen
<% } -%>

      - name: Cache turborepo for Android
        uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
        with:
          path: ${{ env.TURBO_CACHE_DIR }}
          key: ${{ runner.os }}-turborepo-android-${{ hashFiles('yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-turborepo-android-

      - name: Check turborepo cache for Android
        run: |
          TURBO_CACHE_STATUS=$(node -p "($(yarn turbo run build:android --cache-dir="${{ env.TURBO_CACHE_DIR }}" --dry=json)).tasks.find(t => t.task === 'build:android').cache.status")

          if [[ $TURBO_CACHE_STATUS == "HIT" ]]; then
            echo "turbo_cache_hit=1" >> $GITHUB_ENV
          fi

      - name: Install JDK
        if: env.turbo_cache_hit != 1
        uses: actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00 # v4.7.1
        with:
          distribution: 'zulu'
          java-version: '17'

      - name: Finalize Android SDK
        if: env.turbo_cache_hit != 1
        run: |
          /bin/bash -c "yes | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --licenses > /dev/null"

      - name: Cache Gradle
        if: env.turbo_cache_hit != 1
        uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
        with:
          path: |
            ~/.gradle/wrapper
            ~/.gradle/caches
          key: ${{ runner.os }}-gradle-${{ hashFiles('example/android/gradle/wrapper/gradle-wrapper.properties') }}
          restore-keys: |
            ${{ runner.os }}-gradle-

      - name: Build example for Android
        env:
          JAVA_OPTS: "-XX:MaxHeapSize=6g"
        run: |
          yarn turbo run build:android --cache-dir="${{ env.TURBO_CACHE_DIR }}"

  build-ios:
    runs-on: macos-latest

    env:
      XCODE_VERSION: 16.3
      TURBO_CACHE_DIR: .turbo/ios
      RCT_USE_RN_DEP: 1
      RCT_USE_PREBUILT_RNCORE: 1

    steps:
      - name: Checkout
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2

      - name: Setup
        uses: ./.github/actions/setup
<% if (project.moduleConfig === 'nitro-modules' || project.viewConfig === 'nitro-view') { -%>

      - name: Generate nitrogen code
        run: yarn nitrogen
<% } -%>

      - name: Cache turborepo for iOS
        uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
        with:
          path: ${{ env.TURBO_CACHE_DIR }}
          key: ${{ runner.os }}-turborepo-ios-${{ hashFiles('yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-turborepo-ios-

      - name: Check turborepo cache for iOS
        run: |
          TURBO_CACHE_STATUS=$(node -p "($(yarn turbo run build:ios --cache-dir="${{ env.TURBO_CACHE_DIR }}" --dry=json)).tasks.find(t => t.task === 'build:ios').cache.status")

          if [[ $TURBO_CACHE_STATUS == "HIT" ]]; then
            echo "turbo_cache_hit=1" >> $GITHUB_ENV
          fi

      - name: Use appropriate Xcode version
        if: env.turbo_cache_hit != 1
        uses: maxim-lobanov/setup-xcode@60606e260d2fc5762a71e64e74b2174e8ea3c8bd # v1.6.0
        with:
          xcode-version: ${{ env.XCODE_VERSION }}

      - name: Install cocoapods
        if: env.turbo_cache_hit != 1 && steps.cocoapods-cache.outputs.cache-hit != 'true'
        run: |
          cd example
          bundle install
          bundle exec pod repo update --verbose
          bundle exec pod install --project-directory=ios

      - name: Build example for iOS
        run: |
          yarn turbo run build:ios --cache-dir="${{ env.TURBO_CACHE_DIR }}"
<% } else { -%>
  build-web:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2

      - name: Setup
        uses: ./.github/actions/setup

      - name: Build example for Web
        run: |
          yarn example expo export --platform web
<% } -%>
