# GitLab CI for docs-portal (Docusaurus + workflow doc sync).
#
# develop → GitLab Pages preview (https://docs-portal-1c6c85.gitlab.io)
# master  → production (https://esys-ai.org)
#
# Workflow repos trigger sync via multi-project pipeline — see docs-common/automation-model.md

include:
  - local: .gitlab/workflow-sync.yml

workflow:
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
    - if: $CI_COMMIT_BRANCH == "develop"
    - if: $CI_PIPELINE_SOURCE == "pipeline"
    - if: $CI_PIPELINE_SOURCE == "web"
    - if: $CI_PIPELINE_SOURCE == "api"

stages:
  - lint
  - sync
  - validate
  - build
  - pages

default:
  interruptible: true

variables:
  DOCS_SITE_BASE_URL: "/"
  DOCS_PREVIEW_SITE_URL: "https://docs-portal-1c6c85.gitlab.io"
  NODE_VERSION: "20"
  FF_USE_LEGACY_KUBERNETES_EXECUTION_STRATEGY: "true"

.node_base:
  image: node:${NODE_VERSION}-bookworm
  variables:
    NPM_CONFIG_CACHE: "$CI_PROJECT_DIR/.cache/npm"
  cache:
    key: npm-$CI_COMMIT_REF_SLUG
    paths:
      - .cache/npm
      - node_modules/
  before_script:
    - npm ci

audit:website:
  extends: .node_base
  stage: lint
  script:
    - npm audit --audit-level=critical

typecheck:
  extends: .node_base
  stage: lint
  script:
    - npm run typecheck

sync:lint-python:
  extends:
    - .python_sync_image
    - .workflow_sync_vars
  stage: lint
  script:
    - python -m compileall scripts scripts/lib

.docs_build_base:
  extends: .node_base
  stage: build
  needs:
    - job: audit:website
    - job: typecheck
    - job: sync:workflow
      optional: true
    - job: validate:import
      optional: true
    - job: validate:mirrored
      optional: true
  variables:
    DOCS_SITE_BASE_URL: "/"
  script:
    - echo "DOCS_SITE_URL=${DOCS_SITE_URL}"
    - npm run build
  artifacts:
    when: always
    expire_in: 7 days
    paths:
      - build/

docs:build:
  extends: .docs_build_base
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
      variables:
        DOCS_SITE_URL: "https://esys-ai.org"
    - if: $CI_COMMIT_BRANCH == "develop"
      variables:
        DOCS_SITE_URL: $DOCS_PREVIEW_SITE_URL
    - if: $CI_PIPELINE_SOURCE == "pipeline"

.pages_base:
  image: alpine:3.20
  stage: pages
  needs:
    - job: docs:build
      artifacts: true
  script:
    - mkdir -p public
    - cp -a build/. public/
  artifacts:
    paths:
      - public

pages:
  extends: .pages_base
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
      variables:
        PAGES_ENVIRONMENT: production
        PAGES_ENVIRONMENT_URL: "https://esys-ai.org"
    - if: $CI_COMMIT_BRANCH == "develop"
      variables:
        PAGES_ENVIRONMENT: preview
        PAGES_ENVIRONMENT_URL: $DOCS_PREVIEW_SITE_URL
    - if: $CI_PIPELINE_SOURCE == "pipeline" && $CI_COMMIT_BRANCH == "develop"
  environment:
    name: $PAGES_ENVIRONMENT
    url: $PAGES_ENVIRONMENT_URL

docs:smoke:
  stage: pages
  image: curlimages/curl:8.11.1
  retry: 2
  needs:
    - job: pages
      artifacts: false
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
  variables:
    DOCS_SMOKE_BASE_URL: "https://esys-ai.org"
  script:
    - |
      set -eu
      base="${DOCS_SMOKE_BASE_URL}"
      case "$base" in */) base="${base%/}" ;; esac
      echo "Smoke base URL: ${base}"
      for path in / /common/intro/ /superbuild/intro/; do
        url="${base}${path}"
        echo "GET ${url}"
        if ! curl -fsS --retry 12 --retry-all-errors --retry-delay 10 --connect-timeout 15 --max-time 60 "${url}" >/dev/null; then
          echo "Docs smoke failed for ${url}" >&2
          exit 1
        fi
      done
      echo "Docs smoke check passed for ${base}"
