name: CI

on:
  push:
    branches: [ main, develop ]
  pull_request:
    branches: [ main, develop ]

jobs:
  test:
    name: Test
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

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

      - name: Cache Go modules
        uses: actions/cache@v4
        with:
          path: ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
          restore-keys: |
            ${{ runner.os }}-go-

      - name: Download dependencies
        run: go mod download

      - name: Verify dependencies
        run: go mod verify

      - name: Check for test files
        id: check-tests
        run: |
          echo "Checking for test files..."
          TEST_FILES=$(find . -name "*_test.go" -not -path "./vendor/*" -not -path "./.git/*" 2>/dev/null || true)
          if [ -n "$TEST_FILES" ]; then
            echo "Found test files:"
            echo "$TEST_FILES"
            echo "tests_exist=true" >> $GITHUB_OUTPUT
          else
            echo "No test files found. Skipping test execution."
            echo "tests_exist=false" >> $GITHUB_OUTPUT
          fi

      - name: Run tests
        if: steps.check-tests.outputs.tests_exist == 'true'
        env:
          CGO_ENABLED: 1
        run: go test -v -race -coverprofile=coverage.out -timeout=5m ./...

      - name: Upload coverage
        if: steps.check-tests.outputs.tests_exist == 'true'
        uses: codecov/codecov-action@v3
        with:
          file: ./coverage.out
          fail_ci_if_error: false

      - name: Verify build (no tests)
        if: steps.check-tests.outputs.tests_exist == 'false'
        run: |
          echo "No tests found. Verifying code compiles instead..."
          go build ./...

  lint:
    name: Lint
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

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

      - name: golangci-lint
        uses: golangci/golangci-lint-action@v7
        with:
          version: latest
          args: --timeout=5m

  build:
    name: Build
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

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

      - name: Cache Go modules
        uses: actions/cache@v4
        with:
          path: ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
          restore-keys: |
            ${{ runner.os }}-go-

      - name: Download dependencies
        run: go mod download

      - name: Build
        run: |
          go build -v -o bin/platform ./cmd/platform
          go build -v -o bin/api-gateway ./cmd/api-gateway

      - name: Upload build artifacts
        uses: actions/upload-artifact@v3
        with:
          name: binaries
          path: |
            bin/platform
            bin/api-gateway
          retention-days: 7

  fmt:
    name: Format Check
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

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

      - name: Check formatting
        run: |
          if [ "$(gofmt -s -l . | wc -l)" -gt 0 ]; then
            echo "The following files need formatting:"
            gofmt -s -d .
            exit 1
          fi
