FROM ghcr.io/astral-sh/uv:0.11.17 AS uv

# Base stage with common dependencies
FROM 086679231553.dkr.ecr.us-east-1.amazonaws.com/docker-parent-images:lambda-python314 AS base

USER root

RUN dnf -y update

USER worker

# Enable bytecode compilation, to improve cold-start performance.
ENV UV_COMPILE_BYTECODE=1

# Disable installer metadata, to create a deterministic layer.
ENV UV_NO_INSTALLER_METADATA=1

# Enable copy mode to support bind mount caching.
ENV UV_LINK_MODE=copy

# Copy uv binary
COPY --from=uv --chown=worker:worker /uv /bin/uv

# First, install common module dependencies early for better caching
COPY --from=common --chown=worker:worker pyproject.toml README.md ./common/
COPY --from=common --chown=worker:worker common ./common/common

COPY pyproject.toml uv.lock ./

RUN --mount=from=uv,source=/uv,target=/bin/uv \
    --mount=type=cache,uid=1010,gid=1010,mode=755,target=/home/worker/.cache/uv \
    --mount=type=bind,source=uv.lock,target=uv.lock \
    --mount=type=bind,source=pyproject.toml,target=pyproject.toml \
    uv export --frozen --no-emit-workspace --no-dev --no-editable -o requirements.txt && \
    uv pip install -r requirements.txt --target "${LAMBDA_TASK_ROOT}"

RUN --mount=type=cache,uid=1010,gid=1010,mode=755,target=/home/worker/.cache/uv \
    uv pip install ./common --target "${LAMBDA_TASK_ROOT}" && rm -rf ./tests

# Copy application code (this changes frequently, so put it last)
COPY src/ ./src
COPY config.py ./


# Test stage
FROM base AS test

# Install dev dependencies for testing (as worker user)
RUN --mount=type=cache,uid=1010,gid=1010,mode=755,target=/home/worker/.cache/uv \
    uv sync --frozen --dev

# Copy common package into test stage (not inherited from earlier layer installs)
COPY --from=common --chown=worker:worker pyproject.toml README.md ./common/
COPY --from=common --chown=worker:worker common ./common/common

# Install common package into the test venv (editable for quicker iteration if code changes)
RUN --mount=type=cache,uid=1010,gid=1010,mode=755,target=/home/worker/.cache/uv \
    uv pip install -e ./common && rm -rf ./tests

# Copy test files and scripts
COPY tests/ ./tests
COPY scripts/lint-and-test.sh ./

# Set working directory and entrypoint for tests
WORKDIR /var/task
ENTRYPOINT [ "/var/task/lint-and-test.sh" ]

# fmt stage
FROM test AS fmt

# Copy script
COPY scripts/fmt.sh ./

# Set working directory and entrypoint for formatting
WORKDIR /var/task
ENTRYPOINT [ "/var/task/fmt.sh" ]

# Production stage
FROM base AS production

ARG version
LABEL Version=$version
ENV build_version=$version

# Copy Datadog Lambda extension
COPY --from=public.ecr.aws/datadog/lambda-extension:97 --chown=worker:worker /opt/. /opt/

EXPOSE 8080

ENV DD_LAMBDA_HANDLER=src.app.handler
CMD [ "datadog_lambda.handler.handler" ]
