name: Community CI

on:
  push:
    branches: [main]
  pull_request:

permissions:
  contents: read

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

jobs:
  frontend:
    name: Frontend lint, test, and build
    runs-on: ubuntu-latest
    defaults:
      run:
        working-directory: chat2db-community-client
    steps:
      - name: Check out repository
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683

      - name: Set up Node.js
        uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020
        with:
          node-version: 22.22.2
          cache: yarn
          cache-dependency-path: chat2db-community-client/yarn.lock

      - name: Install dependencies
        run: yarn install --frozen-lockfile

      - name: Validate localization catalogs
        run: yarn test:i18n

      - name: Run ESLint
        run: yarn lint:eslint

      - name: Run Stylelint
        run: yarn lint:style

      - name: Run shortcut contract
        run: yarn run test:shortcut

      - name: Run SQL clipboard test
        run: yarn run test:sql-in-clipboard

      - name: Run result Markdown formatter test
        run: yarn run test:result-markdown

      - name: Run active workspace tab locator contract
        run: yarn run test:active-tab-locator

      - name: Run local file tab title contract
        run: yarn run test:local-file-tab-title

      - name: Run saved console tree refresh contract
        run: yarn run test:saved-console-tree-refresh

      - name: Run saved console lifecycle contract
        run: yarn run test:saved-console-lifecycle

      - name: Run BaseTable tree interaction contract
        run: yarn run test:base-table-interaction

      - name: Run database object sorting contract
        run: yarn run test:database-object-sorting

      - name: Run BI chart sorting contract
        run: yarn run test:bi-chart-sorting

      - name: Run BI chart SQL execution result contract
        run: yarn run test:bi-sql-result

      - name: Run ComboAxisSelect action filter contract
        run: yarn run test:combo-axis-actions

      - name: Run BI label rotation contract
        run: yarn run test:label-rotation

      - name: Run Redis explorer contract
        run: yarn run test:redis-explorer

      - name: Run CreateStream index mapping contract
        run: yarn run test:create-stream-index

      - name: Run result inspector contract
        run: yarn run test:result-inspector

      - name: Run result operation record contract
        run: yarn run test:result-operation-record

      - name: Run result tab preference contract
        run: yarn run test:result-tab-preferences

      - name: Run execution console preference contract
        run: yarn run test:execution-console

      - name: Run SQL execution log contract
        run: yarn run test:sql-execution-log

      - name: Run SQL execution batch contract
        run: yarn run test:sql-execution-batch

      - name: Run SQL execution request tracker contract
        run: yarn run test:sql-execution-request-tracker

      - name: Run SQL execution stream contract
        run: yarn run test:sql-execution-stream

      - name: Run SSE request ownership contract
        run: yarn run test:sse-request

      - name: Run verification-code countdown lifecycle contract
        run: yarn run test:verification-code-countdown

      - name: Run settings layout contract
        run: yarn run test:settings-layout

      - name: Build Community web client
        run: yarn run build:web:community --app_version=5.3.0

  backend:
    name: Backend tests and package
    runs-on: ubuntu-latest
    steps:
      - name: Check out repository
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683

      - name: Set up JDK 17
        uses: actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00
        with:
          distribution: temurin
          java-version: '17'
          cache: maven

      - name: Run backend tests
        run: mvn -B test -Dmaven.test.skip=false -DskipTests=false -f chat2db-community-server/pom.xml

      - name: Package backend
        run: mvn -B package -DskipTests -Dmaven.test.skip=false -Dchat2db.finalName=chat2db-community -f chat2db-community-server/pom.xml -pl chat2db-community-start -am

  updater:
    name: Desktop updater tests (${{ matrix.os }})
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, windows-latest, macos-latest]
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
      - uses: actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00
        with:
          distribution: temurin
          java-version: '17'
          cache: maven
      - name: Test Windows signing script
        if: runner.os == 'Windows'
        shell: pwsh
        run: |
          choco install winscp -y --no-progress
          if ($LASTEXITCODE -ne 0) { throw 'WinSCP installation failed' }
          ./script/package/tests/windows-signing-test.ps1 -WinScpPath "${env:ProgramFiles(x86)}/WinSCP/WinSCP.com"

      - name: Test updater and desktop integration
        shell: bash
        run: |
          mvn -B -f chat2db-community-server/pom.xml -pl :chat2db-community-jcef,:chat2db-community-bootstrap -am \
            -Dmaven.test.skip=false -DskipTests=false \
            '-Dtest=Chat2DBBootstrapTest,FullPackage*Test,Update*Test,NativePackageInstallerTest,SemanticVersionTest,InstalledAppVersionReaderTest,TrustedUpdateKeysTest,GitHubReleaseDesktopUpdaterTest,DesktopUpdaterRegistryTest,RestartAppHandlerTest' \
            -Dsurefire.failIfNoSpecifiedTests=false -Dmaven.test.failure.ignore=false test

  repository:
    name: Repository and documentation checks
    runs-on: ubuntu-latest
    steps:
      - name: Check out repository
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683

      - name: Test desktop layout, Beta pointer, and release guards
        run: |
          bash script/package/tests/desktop-layout-test.sh
          python3 script/package/tests/release-deletion-guard-test.py
          ruby script/package/tests/community-beta-workflow-test.rb

      - name: Validate required repository files
        run: |
          test -s README.md
          test -s LICENSE
          test -s SECURITY.md

      - name: Parse YAML configuration files
        shell: ruby {0}
        run: |
          require 'yaml'
          Dir['.github/**/*.yml', '.github/**/*.yaml'].each do |path|
            YAML.safe_load(File.read(path), aliases: false)
            puts "validated #{path}"
          end

      - name: Validate Community operations contracts
        run: ruby script/github/validate-community-operations.rb

      - name: Test macOS native signing selection
        run: bash script/package/tests/sign-macos-native-libraries-test.sh

      - name: Test Community workflow automation
        run: node --test script/github/issue-claim.test.js script/github/sync-community-project.test.js

      - name: Test QQ notification automation
        run: |
          python3 script/github/test_notify_qq.py
          python3 script/github/qq_relay/test_relay_server.py