name: Build and Test

on:
  push:
    branches:
      - main
      - develop
      - 'fix-*'
      - 'feature-*'
    paths:
      - 'common/**'
      - 'config/**'
      - 'network/**'
      - 'server/**'
      - 'go.mod'
      - 'go.sum'
      - 'main.go'
      - '.github/workflows/go.yml'
  pull_request:
    branches:
      - main
      - develop

permissions:
  contents: read

jobs:
  test:
    name: Test
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v4

    - name: Set up Go
      uses: actions/setup-go@v5
      with:
        go-version: '1.25'

    - name: Download dependencies
      run: go mod download

    - name: Run Tests with Race Detector and Coverage
      run: go test -race -coverprofile=coverage.out ./... -timeout=10m

    - name: Check coverage threshold
      run: |
        COVERAGE=$(go tool cover -func=coverage.out | grep '^total:' | awk '{print substr($3, 1, length($3)-1)}')
        echo "Total coverage: ${COVERAGE}%"
        if [ "$(echo "$COVERAGE < 50" | bc)" -eq 1 ]; then
          echo "::error::Coverage ${COVERAGE}% is below 50% threshold"
          exit 1
        fi

  build:
    name: Build
    needs: [test, lint]
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v4

    - name: Set up Go
      uses: actions/setup-go@v5
      with:
        go-version: '1.25'

    - name: Download dependencies
      run: go mod download

    - name: Build Linux-amd64
      run: env GOOS=linux GOARCH=amd64 go build -v

    - name: Upload Linux-amd64 artifacts
      uses: actions/upload-artifact@v4
      with:
        name: Linux-amd64
        path: |
          ./erupe-ce
          ./config.json
          ./www/
          ./savedata/
          ./bin/
        retention-days: 7

    - name: Build Windows-amd64
      run: env GOOS=windows GOARCH=amd64 go build -v

    - name: Upload Windows-amd64 artifacts
      uses: actions/upload-artifact@v4
      with:
        name: Windows-amd64
        path: |
          ./erupe-ce.exe
          ./config.json
          ./www/
          ./savedata/
          ./bin/
        retention-days: 7

  lint:
    name: Lint
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v4

    - name: Set up Go
      uses: actions/setup-go@v5
      with:
        go-version: '1.25'

    - name: Run golangci-lint
      uses: golangci/golangci-lint-action@v7
      with:
        version: v2.10.1
        args: --timeout=5m
