name: Main Workflow

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - "*"

jobs:
  lint-back:
    runs-on: ubuntu-latest
    defaults:
      run:
        working-directory: src/backend
    steps:
      - name: Checkout repository
        uses: actions/checkout@v6
      - name: "Set up Python"
        uses: actions/setup-python@v6
        with:
          python-version-file: "src/backend/pyproject.toml"
      - name: Install uv
        uses: astral-sh/setup-uv@v6
      - name: Install the project
        run: uv sync --locked --all-extras

      - name: Check code formatting with ruff
        run: uv run ruff format . --diff
      - name: Lint code with ruff
        run: uv run ruff check .
      - name: Lint code with pylint
        run: uv run pylint .

  test-back:
    runs-on: ubuntu-latest

    defaults:
      run:
        working-directory: src/backend

    services:
      postgres:
        image: postgres:16
        env:
          POSTGRES_DB: calendars
          POSTGRES_USER: pgroot
          POSTGRES_PASSWORD: pass
        ports:
          - 5432:5432
        options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5

    env:
      DJANGO_CONFIGURATION: Test
      DJANGO_SETTINGS_MODULE: calendars.settings
      DJANGO_SECRET_KEY: ThisIsAnExampleKeyForTestPurposeOnly
      OIDC_OP_JWKS_ENDPOINT: /endpoint-for-test-purpose-only
      DJANGO_EMAIL_HOST: mailcatcher
      DB_HOST: localhost
      DB_NAME: calendars
      DB_USER: pgroot
      DB_PASSWORD: pass
      DB_PORT: 5432
      CALDAV_URL: http://localhost:80
      CALDAV_OUTBOUND_API_KEY: test-outbound-key
      CALDAV_INBOUND_API_KEY: test-inbound-key
      CALDAV_INTERNAL_API_KEY: test-internal-key
      CALDAV_CALLBACK_HOST: localhost
      TRANSLATIONS_JSON_PATH: ${{ github.workspace }}/src/frontend/apps/calendars/src/features/i18n/translations.json

    steps:
      - name: Checkout repository
        uses: actions/checkout@v6

      - name: Create writable /data
        run: |
          sudo mkdir -p /data/media && \
          sudo mkdir -p /data/static

      - name: Build and start CalDAV server
        working-directory: .
        run: |
          docker build -t caldav-test src/caldav
          docker run -d --name caldav-test \
            --network host \
            -e PGHOST=localhost \
            -e PGPORT=5432 \
            -e PGDATABASE=calendars \
            -e PGUSER=pgroot \
            -e PGPASSWORD=pass \
            -e CALDAV_BASE_URI=/caldav/ \
            -e CALDAV_INBOUND_API_KEY=test-inbound-key \
            -e CALDAV_OUTBOUND_API_KEY=test-outbound-key \
            -e CALDAV_INTERNAL_API_KEY=test-internal-key \
            caldav-test \
            sh -c "/usr/local/bin/init-database.sh && apache2-foreground"

      - name: Wait for CalDAV to be ready
        run: |
          timeout 30 bash -c 'until curl -s -o /dev/null http://localhost:80/; do sleep 1; done'
          echo "CalDAV server is ready"

      - name: "Set up Python"
        uses: actions/setup-python@v6
        with:
          python-version-file: "src/backend/pyproject.toml"
      - name: Install uv
        uses: astral-sh/setup-uv@v6
      - name: Install the dependencies
        run: uv sync --locked --all-extras

      - name: Install MIME support
        run: |
          sudo apt-get update
          sudo apt-get install -y pandoc shared-mime-info media-types

      - name: Run tests
        run: uv run pytest -n 2
