name: Main workflow

on:
  workflow_dispatch:
  pull_request:
  push:
  schedule:
    # Prime the caches every Monday
    - cron: 0 1 * * MON

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name == 'pull_request' || github.sha }}
  cancel-in-progress: true

jobs:
  build-test-default:
    if: github.event.pull_request.draft == false
    strategy:
      fail-fast: false
      matrix:
        os:
          - ubuntu-latest
          - macos-latest
        ocaml-compiler:
          - "5"
        local-packages:
          - |
            *.opam
            !cohttp-eio.opam
            !cohttp-curl-async.opam
            !cohttp-async.opam
            !cohttp-bench.opam

    runs-on: ${{ matrix.os }}

    steps:
      - name: Checkout tree
        uses: actions/checkout@v5

      - name: Set-up OCaml ${{ matrix.ocaml-compiler }}
        uses: ocaml/setup-ocaml@v3
        with:
          ocaml-compiler: ${{ matrix.ocaml-compiler }}
          dune-cache: true
          opam-local-packages: ${{ matrix.local-packages }}

      - run: |
          sudo apt-get update && sudo apt-get upgrade
          opam install conf-libcurl
        if: ${{ matrix.os == 'ubuntu-latest' }}

      - run: |
          brew update
        if: ${{ matrix.os == 'macos-latest' }}

      - run: echo "PKG_CONFIG_PATH=$(brew --prefix openssl)/lib/pkgconfig" >>"$GITHUB_ENV"
        if: ${{ matrix.os == 'macos-latest' }}

      - run: opam install --with-test --deps-only http cohttp cohttp-lwt cohttp-lwt-unix cohttp-server-lwt-unix cohttp-mirage cohttp-curl-lwt cohttp-curl cohttp-top
      - run: opam exec -- dune build http cohttp cohttp-lwt cohttp-lwt-unix cohttp-server-lwt-unix cohttp-mirage cohttp-curl-lwt cohttp-curl cohttp-top
      - run: opam exec -- dune runtest http cohttp cohttp-lwt cohttp-lwt-unix cohttp-server-lwt-unix cohttp-mirage cohttp-curl-lwt cohttp-curl cohttp-top

  build-test-cohttp-async:
    if: github.event.pull_request.draft == false
    strategy:
      fail-fast: false
      matrix:
        os:
          - ubuntu-latest
          - macos-latest
        ocaml-compiler:
          - "5.2"
        local-packages:
          - |
            *.opam
            !cohttp-mirage.opam
            !cohttp-curl-lwt.opam
            !cohttp-lwt-jsoo.opam
            !cohttp-lwt-unix.opam
            !cohttp-lwt.opam
            !cohttp-server-lwt-unix.opam
            !cohttp-eio.opam
            !cohttp-bench.opam

    runs-on: ${{ matrix.os }}

    steps:
      - name: Checkout tree
        uses: actions/checkout@v5

      - name: Set-up OCaml ${{ matrix.ocaml-compiler }}
        uses: ocaml/setup-ocaml@v3
        with:
          ocaml-compiler: ${{ matrix.ocaml-compiler }}
          dune-cache: true
          opam-local-packages: ${{ matrix.local-packages }}

      - run: |
          sudo apt-get update && sudo apt-get upgrade
          opam install conf-libcurl
        if: ${{ matrix.os == 'ubuntu-latest' }}

      - run: echo "PKG_CONFIG_PATH=$(brew --prefix openssl)/lib/pkgconfig" >>"$GITHUB_ENV"
        if: ${{ matrix.os == 'macos-latest' }}

      - run: opam install --with-test --deps-only http cohttp cohttp-async cohttp-curl-async cohttp-curl cohttp-top
      - run: opam exec -- dune build http cohttp cohttp-async cohttp-curl-async cohttp-curl cohttp-top
      - run: opam exec -- dune runtest http cohttp cohttp-async cohttp-curl-async cohttp-curl cohttp-top

  build-test-cohttp-eio:
    if: github.event.pull_request.draft == false
    strategy:
      fail-fast: false
      matrix:
        os:
          - ubuntu-latest
          - macos-latest
        ocaml-compiler:
          - "5"
        local-packages:
          - |
            http.opam
            cohttp.opam
            cohttp-eio.opam

    runs-on: ${{ matrix.os }}

    steps:
      - name: Checkout tree
        uses: actions/checkout@v5

      - name: Set-up OCaml ${{ matrix.ocaml-compiler }}
        uses: ocaml/setup-ocaml@v3
        with:
          ocaml-compiler: ${{ matrix.ocaml-compiler }}
          dune-cache: true
          opam-local-packages: ${{ matrix.local-packages }}
          opam-repositories: |
            default: https://github.com/ocaml/opam-repository.git
            alpha: https://github.com/kit-ty-kate/opam-alpha-repository.git

      - run: opam install --with-test --deps-only cohttp-eio
      - run: opam exec -- dune build cohttp-eio
      - run: opam exec -- dune runtest cohttp-eio

  build-test-cohttp-bench:
    if: github.event.pull_request.draft == false
    strategy:
      fail-fast: false
      matrix:
        os:
          - ubuntu-latest
        ocaml-compiler:
          - "5.2"
        local-packages:
          - |
            *.opam

    runs-on: ${{ matrix.os }}

    steps:
      - name: Checkout tree
        uses: actions/checkout@v5

      - name: Set-up OCaml ${{ matrix.ocaml-compiler }}
        uses: ocaml/setup-ocaml@v3
        with:
          ocaml-compiler: ${{ matrix.ocaml-compiler }}
          dune-cache: true
          opam-local-packages: ${{ matrix.local-packages }}
          opam-repositories: |
            default: https://github.com/ocaml/opam-repository.git
            alpha: https://github.com/kit-ty-kate/opam-alpha-repository.git

      - run: opam install --with-test --deps-only cohttp-bench
      - run: opam exec -- dune build cohttp-bench
      - run: opam exec -- dune runtest cohttp-bench
