name: CI

on:
  pull_request:
  push:
    branches: [ main ]

jobs:
  lint:
    runs-on: codeberg-small
    steps:
      - name: Checkout code
        uses: https://github.com/actions/checkout@v4

      - name: Set up Go
        uses: https://github.com/actions/setup-go@v5
        with:
          go-version: '1.21'
          cache: true

      - name: Install golangci-lint
        run: |
          curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/HEAD/install.sh | sh -s -- -b $(go env GOPATH)/bin v2.6.2

      - name: Run golangci-lint
        run: golangci-lint run --timeout 5m

  build:
    runs-on: codeberg-small
    steps:
      - name: Checkout code
        uses: https://github.com/actions/checkout@v4

      - name: Set up Go
        uses: https://github.com/actions/setup-go@v5
        with:
          go-version: '1.21'
          cache: true

      - name: Build application
        run: make build

  test:
    runs-on: codeberg-small
    steps:
      - name: Checkout code
        uses: https://github.com/actions/checkout@v4

      - name: Set up Go
        uses: https://github.com/actions/setup-go@v5
        with:
          go-version: '1.21'
          cache: true

      - name: Run unit tests
        run: go test -v -race ./...

  functional:
    runs-on: codeberg-small
    if: github.ref == 'refs/heads/main' || github.event_name == 'pull_request'
    needs: [build, test]
    steps:
      - name: Checkout code
        uses: https://github.com/actions/checkout@v4

      - name: Set up Go
        uses: https://github.com/actions/setup-go@v5
        with:
          go-version: '1.21'
          cache: true

      - name: Build production binary
        run: |
          make build
          echo "Binary built at: $(pwd)/bin/fj"

      - name: Run functional tests
        run: go test -v -race -tags=functional ./tests/functional/...
        env:
          CODEBERG_TEST_TOKEN: ${{ secrets.CODEBERG_TEST_TOKEN }}
          CODEBERG_TEST_OWNER: ${{ vars.CODEBERG_TEST_OWNER }}
          CODEBERG_TEST_REPO: ${{ vars.CODEBERG_TEST_REPO }}
          CODEBERG_TEST_HOSTNAME: ${{ vars.CODEBERG_TEST_HOSTNAME || 'codeberg.org' }}
