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

# Clone upstream Datadog Forwarder source at a pinned version
FROM alpine/git:latest AS source
ARG FORWARDER_VERSION=5.4.0
RUN git clone --depth 1 --branch aws-dd-forwarder-${FORWARDER_VERSION} \
    https://github.com/DataDog/datadog-serverless-functions.git /src

# Note: The Go trace_forwarder shared library (trace-intake.so) is NOT included.
# The upstream Go source is incompatible with
# modern Go toolchains due to datadog-agent module restructuring.
# This is acceptable because:
#   1. Trace forwarding via the Forwarder is deprecated by Datadog
#   2. The Datadog Lambda Extension (included below) handles traces directly
#   3. Log and metric forwarding work without it

# Builder stage: install Python dependencies (uv stays here, not in production)
FROM 086679231553.dkr.ecr.us-east-1.amazonaws.com/docker-parent-images:lambda-python314 AS builder

USER root
COPY --from=uv /uv /bin/uv

# Enable bytecode compilation for better cold-start performance
ENV UV_COMPILE_BYTECODE=1
# Disable installer metadata for deterministic layers
ENV UV_NO_INSTALLER_METADATA=1
# Enable copy mode to support bind mount caching
ENV UV_LINK_MODE=copy

COPY --from=source /src/aws/logs_monitoring/requirements.txt /tmp/requirements.txt
RUN --mount=type=cache,target=/root/.cache/uv \
    uv pip install -r /tmp/requirements.txt --target /deps && \
    # Remove test files and type stubs to save space
    find /deps -type d -name tests -exec rm -rf {} + 2>/dev/null; \
    find /deps -type d -name test -exec rm -rf {} + 2>/dev/null; \
    find /deps -name '*.pyi' -delete 2>/dev/null; true

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

USER root
RUN dnf -y update && dnf clean all && rm -rf /var/cache/dnf
USER worker

# Copy pre-built dependencies from builder
COPY --from=builder --chown=worker:worker /deps/ ${LAMBDA_TASK_ROOT}/

# Copy forwarder source code
COPY --from=source --chown=worker:worker /src/aws/logs_monitoring/*.py ${LAMBDA_TASK_ROOT}/
COPY --from=source --chown=worker:worker /src/aws/logs_monitoring/caching/ ${LAMBDA_TASK_ROOT}/caching/
COPY --from=source --chown=worker:worker /src/aws/logs_monitoring/logs/ ${LAMBDA_TASK_ROOT}/logs/
COPY --from=source --chown=worker:worker /src/aws/logs_monitoring/steps/ ${LAMBDA_TASK_ROOT}/steps/
COPY --from=source --chown=worker:worker /src/aws/logs_monitoring/retry/ ${LAMBDA_TASK_ROOT}/retry/
COPY --from=source --chown=worker:worker /src/aws/logs_monitoring/trace_forwarder/__init__.py ${LAMBDA_TASK_ROOT}/trace_forwarder/
# Use stub connection.py that gracefully handles missing trace-intake.so
COPY --chown=worker:worker trace_forwarder_connection_stub.py ${LAMBDA_TASK_ROOT}/trace_forwarder/connection.py

# Test stage
FROM base AS test
COPY --chmod=755 lint-and-test.sh ./
ENTRYPOINT [ "/var/task/lint-and-test.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:96 --chown=worker:worker /opt/. /opt/

EXPOSE 8080

CMD ["lambda_function.lambda_handler"]
