name: CI

on:
  push:
    branches: [main]
    paths:
      - 'src/**'
      - 'src-tauri/**'
  pull_request:
    paths:
      - 'src/**'
      - 'src-tauri/**'
  workflow_dispatch:

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

jobs:
  check:
    # windows-latest to match the release target — the ML crates (ort, candle)
    # and the NSIS bundle only ever ship from Windows.
    runs-on: windows-latest
    env:
      GITEA_STATUS_TOKEN: ${{ secrets.GITEA_STATUS_TOKEN }}
    steps:
      - name: Report pending status to Gitea
        if: github.event_name != 'pull_request' && env.GITEA_STATUS_TOKEN != ''
        continue-on-error: true
        shell: pwsh
        env:
          GITHUB_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
        run: |
          $headers = @{
            Authorization = "token $env:GITEA_STATUS_TOKEN"
            Accept = "application/json"
          }
          $body = @{
            state = "pending"
            context = "github/actions/ci"
            description = "GitHub Actions CI is running"
            target_url = $env:GITHUB_RUN_URL
          } | ConvertTo-Json
          Invoke-RestMethod `
            -Method Post `
            -Uri "https://git.jezz.wtf/api/v1/repos/JezzWTF/phokus/statuses/$env:GITHUB_SHA" `
            -Headers $headers `
            -ContentType "application/json" `
            -Body $body

      - uses: actions/checkout@v4

      - uses: pnpm/action-setup@v4
        with:
          version: 11

      - uses: actions/setup-node@v4
        with:
          node-version: 22
          cache: pnpm

      - name: Install frontend dependencies
        run: pnpm install --frozen-lockfile

      # tsc + vite build; also produces dist/ which tauri's build script expects
      - name: Type-check and build frontend
        run: pnpm build:vite

      - name: Install Rust stable
        uses: dtolnay/rust-toolchain@stable
        with:
          components: clippy, rustfmt

      - uses: Swatinem/rust-cache@v2
        with:
          workspaces: src-tauri

      - name: Rustfmt
        working-directory: src-tauri
        run: cargo fmt --check

      # --no-default-features: default enables candle-cuda for the main dev
      # machine; CI runners have no CUDA toolkit and must build CPU-only.
      - name: Clippy
        working-directory: src-tauri
        run: cargo clippy --all-targets --locked --no-default-features -- -D warnings

      - name: Report final status to Gitea
        if: always() && github.event_name != 'pull_request' && env.GITEA_STATUS_TOKEN != ''
        continue-on-error: true
        shell: pwsh
        env:
          GITHUB_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
          JOB_STATUS: ${{ job.status }}
        run: |
          $state = switch ($env:JOB_STATUS) {
            "success" { "success" }
            "failure" { "failure" }
            default { "error" }
          }
          $headers = @{
            Authorization = "token $env:GITEA_STATUS_TOKEN"
            Accept = "application/json"
          }
          $body = @{
            state = $state
            context = "github/actions/ci"
            description = "GitHub Actions CI finished: $env:JOB_STATUS"
            target_url = $env:GITHUB_RUN_URL
          } | ConvertTo-Json
          Invoke-RestMethod `
            -Method Post `
            -Uri "https://git.jezz.wtf/api/v1/repos/JezzWTF/phokus/statuses/$env:GITHUB_SHA" `
            -Headers $headers `
            -ContentType "application/json" `
            -Body $body
