name: CI

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

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout source (adaptive)
        continue-on-error: true
        run: |
          set -euo pipefail
          CANDIDATES="
          http://gitea:3000/${{ github.repository }}
          http://host.docker.internal:3000/${{ github.repository }}
          http://172.17.0.1:3000/${{ github.repository }}
          http://172.18.0.1:3000/${{ github.repository }}
          http://172.19.0.1:3000/${{ github.repository }}
          http://172.20.0.1:3000/${{ github.repository }}
          https://git.produktor.io/${{ github.repository }}
          https://git.produktor.io/${{ github.repository }}.git
          "
          REPO_URL=""
          for URL in ${CANDIDATES}; do
            echo "Trying ${URL}"
            if git -c http.sslVerify=false ls-remote "${URL}" >/dev/null 2>&1; then
              REPO_URL="${URL}"
              break
            fi
          done

          if [ -n "${REPO_URL}" ]; then
            echo "Using repo URL: ${REPO_URL}"
            rm -rf .git
            git init .
            git remote add origin "${REPO_URL}"
            git -c http.sslVerify=false fetch --depth=1 origin "${{ github.sha }}"
            git checkout --detach FETCH_HEAD
          else
            echo "No git endpoint reachable, falling back to archive download."
            rm -rf ./*
            curl -k -L "https://git.produktor.io/${{ github.repository }}/archive/main.tar.gz" -o repo.tar.gz
            tar -xzf repo.tar.gz --strip-components=1
            rm -f repo.tar.gz
          fi

          test -f go.mod

      - name: Detect source availability
        id: source
        run: |
          if [ -f go.mod ]; then
            echo "present=true" >> "$GITHUB_OUTPUT"
          else
            echo "present=false" >> "$GITHUB_OUTPUT"
          fi

      - name: Setup Go
        if: steps.source.outputs.present == 'true'
        uses: actions/setup-go@v5
        with:
          go-version: "1.25.x"

      - name: Go tests
        if: steps.source.outputs.present == 'true'
        run: go test ./...

      - name: Setup Bun
        if: steps.source.outputs.present == 'true'
        uses: oven-sh/setup-bun@v2
        with:
          bun-version: latest

      - name: Bun install
        if: steps.source.outputs.present == 'true'
        working-directory: libs/geo-api-client
        run: bun install

      - name: Bun tests
        if: steps.source.outputs.present == 'true'
        working-directory: libs/geo-api-client
        run: bun test

      - name: Source unavailable warning
        if: steps.source.outputs.present != 'true'
        run: echo "::warning::Repository source could not be fetched in runner network; test steps were skipped."
