name: Continuous Integration

"on":
    push:
        branches: ["main"]
    pull_request:
        branches: ["main"]
    schedule:
        - cron: "0 0 * * MON"

permissions:
    contents: read

env:
    # Fix for symfony/color detection. We know GitHub Actions can handle it
    ANSICON: 1
    CASTOR_CONTEXT: ci

jobs:
    check-dockerfiles:
        name: Check Dockerfile
        runs-on: ubuntu-latest
        steps:
            - name: Checkout
              uses: actions/checkout@v4

            - name: Check php/Dockerfile
              uses: hadolint/hadolint-action@v3.1.0
              with:
                  dockerfile: infrastructure/docker/services/php/Dockerfile

    ci:
        name: Test with PHP ${{ matrix.php-version }}
        strategy:
            fail-fast: false
            matrix:
                php-version: ["8.1", "8.2", "8.3"]
        runs-on: ubuntu-latest
        env:
            DS_PHP_VERSION: ${{ matrix.php-version }}
        steps:
            - uses: actions/checkout@v4

            # Setup

            - name: Setup PHP
              uses: shivammathur/setup-php@v2
              with:
                  php-version: 8.2
                  tools: castor

            - name: "Build and start the infrastructure"
              run: "castor start && sleep 5"

            - name: "Check PHP coding standards"
              run: "castor qa:cs"

            - name: "Run PHPStan"
              run: "castor qa:phpstan"

            - name: "Test HTTP server"
              run: |
                  set -e
                  set -o pipefail

                  curl --fail --insecure --silent -H "Host: app.test" https://127.0.0.1 | grep "Hello world"
                  curl --fail --insecure --silent -H "Host: app.test" https://127.0.0.1 | grep "${{ matrix.php-version }}"

            - name: "Test builder"
              run: |
                  set -e
                  set -o pipefail

                  cat > .castor/test.php <<'EOPHP'
                  <?php

                  use Castor\Attribute\AsTask;
                  use function docker\docker_compose_run;

                  #[AsTask()]
                  function test()
                  {
                      docker_compose_run('echo "Hello World"');
                  }
                  EOPHP

                  castor test | grep "Hello World"

            - name: "Test communication with DB"
              run: |
                  set -e
                  set -o pipefail

                  cat > application/public/index.php <<'EOPHP'
                  <?php
                  $pdo = new PDO('pgsql:host=postgres;dbname=app', 'app', 'app');
                  $pdo->exec('CREATE TABLE test (id integer NOT NULL)');
                  $pdo->exec('INSERT INTO test VALUES (1)');
                  echo $pdo->query('SELECT * from test')->fetchAll() ? 'database OK' : 'database KO';
                  EOPHP

                  # FPM seems super slow to detect the change, we need to wait a bit
                  sleep 3

                  curl --fail --insecure --silent -H "Host: app.test" https://127.0.0.1 | grep "database OK"