name: CI

on:
  push:
    branches:
      - master
      - v1.10
  pull_request:
    types:
      - opened
      - synchronize
  workflow_dispatch:
    inputs:
      freeswitch_ref:
        description: 'FreeSWITCH repository ref'
        required: false
        type: string
      sofia-sip_ref:
        description: 'Sofia-Sip repository ref'
        required: false
        type: string
      dind:
        description: 'Run tests using Docker-in-Docker'
        required: false
        type: boolean
        default: false

env:
  CI_BASE_STATIC_IMAGE: signalwire/freeswitch-public-ci-base:bookworm-amd64
  DOCKER_BUILD_SUMMARY: false
  DOCKER_BUILD_CHECKS_ANNOTATIONS: false
  DOCKER_BUILD_RECORD_UPLOAD: false

jobs:
  unit-tests-pre-config:
    if: ${{ !inputs.dind }}
    name: "Unit-tests pre-config"
    runs-on: ubuntu-latest
    env:
      TOTAL_GROUPS: 2
    outputs:
      matrix: ${{ steps.set-matrix.outputs.matrix }}
      container-image: ${{ steps.set-vars.outputs.container-image }}
      working-directory: ${{ steps.set-vars.outputs.working-directory }}
      tests-only: ${{ steps.set-vars.outputs.tests-only }}
    steps:
      - id: set-matrix
        shell: bash
        run: |
          MATRIX=$(jq -c -n --argjson groups "${{ env.TOTAL_GROUPS }}" \
            '{
              include: [range(1; $groups + 1) | {group: ., total: $groups}]
            }')
          echo "matrix=$MATRIX" | tee -a $GITHUB_OUTPUT
      - id: set-vars
        shell: bash
        run: |
          echo "tests-only=false" >> $GITHUB_OUTPUT
          echo "working-directory=freeswitch/tests/unit" >> $GITHUB_OUTPUT
          echo "container-image=$CI_BASE_STATIC_IMAGE" >> $GITHUB_OUTPUT

  unit-tests:
    if: ${{ !inputs.dind }}
    name: "Unit-tests (group ${{ matrix.group }})"
    needs:
      - unit-tests-pre-config
    strategy:
      fail-fast: false
      matrix: ${{ fromJson(needs.unit-tests-pre-config.outputs.matrix) }}
    uses: ./.github/workflows/unit-test.yml
    with:
      total-groups: ${{ matrix.total }}
      current-group: ${{ matrix.group }}
      container-image: ${{ needs.unit-tests-pre-config.outputs.container-image }}
      working-directory: ${{ needs.unit-tests-pre-config.outputs.working-directory }}
      tests-only: ${{ fromJson(needs.unit-tests-pre-config.outputs.tests-only) }}
    secrets: inherit

  validate-unit-tests:
    if: ${{ always() && !inputs.dind }}
    name: "Validate Unit-tests"
    needs: unit-tests
    runs-on: ubuntu-latest
    steps:
      - name: Check unit tests status
        run: |
          if [ "${{ needs.unit-tests.result }}" != "success" ]; then
            exit 1
          fi

  unit-tests-dind:
    if: ${{ inputs.dind }}
    name: "Unit-tests D-in-D"
    uses: ./.github/workflows/unit-test-dind.yml
    with:
      freeswitch_ref: ${{ inputs.freeswitch_ref }}
      sofia-sip_ref: ${{ inputs.sofia-sip_ref }}
    secrets: inherit

  scan-build:
    name: "Scan Build"
    uses: ./.github/workflows/scan-build.yml
    secrets: inherit