# Tag of the base images (lambda-test-runner-base, playwright-tests-base) in
# ECR used by the lambda-test-runner and ecs-runner targets. Jenkins passes the
# commit SHA when base inputs changed, otherwise latest.
# Must be declared before the first FROM to be usable in FROM lines.
ARG BASE_TAG=latest

# Base image for ecs-runner — rebuilt only when base inputs change (lockfile,
# package.json, workspace config, or this stage). Pushed to ECR as
# playwright-tests-base and referenced below via BASE_TAG.
FROM 086679231553.dkr.ecr.us-east-1.amazonaws.com/docker-parent-images:node24 AS ecs-runner-base
USER root

ENV CI=true \
    RUNTIME_ENV='ecs' \
    TZ="UTC"

WORKDIR /app

# Install pnpm (rarely changes)
RUN npm install -g pnpm@10.31.0

# Install dependencies (changes only when lockfile changes)
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
RUN pnpm install --frozen-lockfile

# Install only Chromium (the only browser used) with OS deps
RUN pnpm exec playwright install chromium --with-deps \
    && rm -rf /tmp/* /var/cache/* /var/tmp/*

# ECS runner — builds FROM the prebuilt base in ECR (BASE_TAG declared at top
# of file). Local builds resolve this via ECR auth, or build the base locally:
# docker compose build ecs-runner-base
FROM 086679231553.dkr.ecr.us-east-1.amazonaws.com/playwright-tests-base:${BASE_TAG} AS ecs-runner
USER root

# Copy source and build (changes on every commit)
COPY . .
RUN pnpm tsc framework/src/s3Handler.ts framework/src/uploadReportsToS3.ts framework/src/tagsToGrep.ts framework/src/executeParallelJob.ts \
    && pnpm bddgen

ENTRYPOINT ["/bin/bash", "-c"]

FROM 086679231553.dkr.ecr.us-east-1.amazonaws.com/docker-parent-images:node24 AS framework-runner
USER root

ENV CI=true

# Create jenkins user (never changes — cached early)
ARG UID=1103
ARG GID=1103
RUN groupadd -g $GID -o jenkins \
    && useradd -m -u $UID -g $GID -o -s /bin/bash jenkins

# Install pnpm (rarely changes)
RUN npm install -g pnpm@10.31.0

# Install dependencies (changes only when lockfile changes)
COPY framework/package.json framework/pnpm-lock.yaml tsconfig.json ./
RUN pnpm install --frozen-lockfile

# Copy framework source and config
COPY framework/src/ /framework/src/
COPY framework/index.html_template /framework/index.html_template
COPY framework/playwright-merge.config.cjs /framework/playwright-merge.config.cjs

# Copy test support files
COPY features/ features/
COPY src/utils/aws/SecretsManagerClient.ts src/utils/aws/SecretsManagerClient.ts

# Remove unneeded files, create dirs, build, and fix ownership in one layer
RUN rm -f framework/src/lambda-handler.ts framework/src/executeParallelJob.ts \
    && mkdir -p playwright-report report \
    && pnpm exec tsc \
    && chown jenkins:jenkins /framework \
    && chown -R jenkins:jenkins /playwright-report /report

USER jenkins
ENTRYPOINT ["node", "framework/src/runFramework.js"]

# Base image for lambda-test-runner — rebuilt only when base inputs change
# (lockfile, package.json, workspace config, or this stage). Pushed to ECR as
# lambda-test-runner-base and referenced below via BASE_TAG.
FROM public.ecr.aws/lambda/nodejs:24 AS lambda-test-runner-base
USER root

ENV CI=true \
    PLAYWRIGHT_BLOB_OUTPUT_DIR='/tmp/blob-report' \
    RUNTIME_ENV='lambda' \
    PLAYWRIGHT_BROWSERS_PATH=/var/task/node_modules/.playwright \
    DD_LAMBDA_HANDLER=framework/src/lambda-handler.handler \
    DD_CIVISIBILITY_AGENTLESS_ENABLED="true" \
    TZ="UTC"

WORKDIR /var/task

COPY --from=public.ecr.aws/datadog/lambda-extension:97 /opt/. /opt/

# Install Chromium system dependencies (rarely changes)
RUN dnf install -y --setopt=install_weak_deps=0 \
    atk cups-libs gtk3 libXcomposite libXcursor libXdamage libXext \
    libXi libXrandr libXScrnSaver libXtst pango alsa-lib libdrm \
    libxkbcommon libxshmfence mesa-libgbm nspr nss \
    && dnf clean all \
    && rm -rf /var/cache/dnf

# Install pnpm + dependencies (changes only when lockfile changes)
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
RUN npm install -g pnpm@10.31.0 \
    && pnpm install --frozen-lockfile \
    && pnpm exec playwright install chromium \
    && rm -rf /tmp/* /var/cache/* /var/tmp/*

# Test runner — builds FROM the prebuilt base in ECR (BASE_TAG declared at top
# of file). Local builds resolve this via ECR auth, or build the base locally:
# docker compose build lambda-test-runner-base
FROM 086679231553.dkr.ecr.us-east-1.amazonaws.com/lambda-test-runner-base:${BASE_TAG} AS lambda-test-runner
USER root

# Copy source and build (changes on every commit)
COPY src ./src
COPY features ./features
COPY playwright.config.ts tsconfig.json env.ts ./
COPY framework/src/getRunId.ts framework/src/s3Handler.ts \
     framework/src/uploadReportsToS3.ts framework/src/tagsToGrep.ts \
     framework/src/executeParallelJob.ts framework/src/lambda-handler.ts ./framework/src/
RUN pnpm tsc framework/src/uploadReportsToS3.ts framework/src/tagsToGrep.ts framework/src/executeParallelJob.ts framework/src/lambda-handler.ts \
    && pnpm bddgen \
    && rm -rf features

CMD ["node_modules/datadog-lambda-js/dist/handler.handler"]
