name: CI

on:
  push:
    branches: [master]
  pull_request:
    branches: [master, dev]
  workflow_dispatch:

jobs:
  lint-markdown:
    name: Markdown Lint
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Run markdownlint
        run: bash scripts/lint-markdown.sh

  format-check:
    name: Format Check
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Setup .NET 10
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: '10.0.x'

      - name: Check formatting
        run: dotnet format src/EchoHub.slnx --verify-no-changes --verbosity diagnostic

  build-and-test:
    name: Build & Test
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Check for src/ changes
        id: changes
        env:
          EVENT: ${{ github.event_name }}
          BEFORE: ${{ github.event.before }}
          BASE_REF: ${{ github.base_ref }}
        run: |
          if [ "$EVENT" = "pull_request" ]; then
            git fetch origin "$BASE_REF" --depth=1
            CHANGED=$(git diff --name-only "origin/$BASE_REF"...HEAD -- 'src/' | wc -l)
          elif [ -z "$BEFORE" ] || [ "$BEFORE" = "0000000000000000000000000000000000000000" ]; then
            CHANGED=1
          else
            CHANGED=$(git diff --name-only "$BEFORE" HEAD -- 'src/' | wc -l)
          fi
          [ "$CHANGED" -gt 0 ] && echo "src_changed=true" >> "$GITHUB_OUTPUT" || echo "src_changed=false" >> "$GITHUB_OUTPUT"

      - name: Setup .NET 10
        if: steps.changes.outputs.src_changed == 'true'
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: '10.0.x'

      - name: Cache NuGet packages
        if: steps.changes.outputs.src_changed == 'true'
        uses: actions/cache@v4
        with:
          path: ~/.nuget/packages
          key: nuget-${{ runner.os }}-${{ hashFiles('src/**/*.csproj') }}
          restore-keys: nuget-${{ runner.os }}-

      - name: Restore dependencies
        if: steps.changes.outputs.src_changed == 'true'
        run: dotnet restore src/EchoHub.slnx

      - name: Build
        if: steps.changes.outputs.src_changed == 'true'
        run: dotnet build src/EchoHub.slnx --no-restore --configuration Release

      - name: Test
        if: steps.changes.outputs.src_changed == 'true'
        run: dotnet test src/EchoHub.slnx --no-build --configuration Release --verbosity normal

      - name: Skip notice
        if: steps.changes.outputs.src_changed == 'false'
        run: echo "No changes in src/ — skipping build and test"
