name: erp-kit App CI

on:
  push:
    branches: [main]
    paths:
      - "apps/**"
  pull_request:
    branches: [main]
    paths:
      - "apps/**"

jobs:
  detect-apps:
    runs-on: ubuntu-slim
    timeout-minutes: 5
    permissions:
      contents: read
    outputs:
      backend: ${{ steps.detect.outputs.backend }}
      frontend: ${{ steps.detect.outputs.frontend }}
    steps:
      - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
        with:
          persist-credentials: false
          fetch-depth: 0

      - name: Get changed files
        id: changed
        run: |
          if [ "${{ github.event_name }}" = "pull_request" ]; then
            base="${{ github.event.pull_request.base.sha }}"
          else
            base="${{ github.event.before }}"
          fi
          changed_apps=$(git diff --name-only "$base" HEAD -- 'apps/' | cut -d/ -f2 | sort -u | jq -Rsc 'split("\n") | map(select(. != ""))')
          echo "apps=$changed_apps" >> "$GITHUB_OUTPUT"

      - name: Detect app targets
        id: detect
        env:
          CHANGED_APPS: ${{ steps.changed.outputs.apps }}
        run: |
          changed="$CHANGED_APPS"
          backend="[]"
          frontend="[]"
          for app in $(echo "$changed" | jq -r '.[]'); do
            [ -f "apps/$app/backend/package.json" ] && backend=$(echo "$backend" | jq -c --arg a "$app" '. + [$a] | unique')
            [ -f "apps/$app/frontend/package.json" ] && frontend=$(echo "$frontend" | jq -c --arg a "$app" '. + [$a] | unique')
          done
          echo "backend=$backend" >> "$GITHUB_OUTPUT"
          echo "frontend=$frontend" >> "$GITHUB_OUTPUT"

  backend:
    needs: detect-apps
    if: needs.detect-apps.outputs.backend != '[]'
    runs-on: ubuntu-slim
    timeout-minutes: 10
    permissions:
      contents: read
    strategy:
      fail-fast: false
      matrix:
        app: ${{ fromJson(needs.detect-apps.outputs.backend) }}
    steps:
      - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
        with:
          persist-credentials: false

      - uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10

      - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
        with:
          cache: pnpm
          cache-dependency-path: ./pnpm-lock.yaml
          node-version-file: package.json

      - run: pnpm install

      - name: Lint
        working-directory: apps/${{ matrix.app }}/backend
        run: pnpm run lint

      - name: Typecheck
        working-directory: apps/${{ matrix.app }}/backend
        run: pnpm run typecheck

  frontend:
    needs: detect-apps
    if: needs.detect-apps.outputs.frontend != '[]'
    runs-on: ubuntu-slim
    timeout-minutes: 10
    permissions:
      contents: read
    strategy:
      fail-fast: false
      matrix:
        app: ${{ fromJson(needs.detect-apps.outputs.frontend) }}
    steps:
      - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
        with:
          persist-credentials: false

      - uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10

      - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
        with:
          cache: pnpm
          cache-dependency-path: ./pnpm-lock.yaml
          node-version-file: package.json

      - run: pnpm install

      - name: Lint
        working-directory: apps/${{ matrix.app }}/frontend
        run: pnpm run lint

      - name: Typecheck
        working-directory: apps/${{ matrix.app }}/frontend
        run: pnpm run typecheck

      - name: Build
        working-directory: apps/${{ matrix.app }}/frontend
        run: pnpm run build
