#syntax=docker/dockerfile:1.19.0-labs

ARG PYTHON_VERSION=3.13
ARG PYTHON_DIGEST=sha256:f48813386e87ea5be92aa57844fb90f5a9db618ffd3a6fee86d432497cd787b4
ARG UV_VERSION=0.11.29

FROM ghcr.io/astral-sh/uv:${UV_VERSION} AS uv

FROM public.ecr.aws/lambda/python:${PYTHON_VERSION}@${PYTHON_DIGEST} AS builder
RUN --mount=type=cache,target=/var/cache/dnf \
    --mount=type=cache,target=/var/cache/yum \
    dnf install -y git

COPY --from=uv /uv /uvx /usr/local/bin/
ENV UV_COMPILE_BYTECODE=1
ENV UV_NO_INSTALLER_METADATA=1
ENV UV_LINK_MODE=copy

WORKDIR /source
ARG SERVICE_NAME
COPY --parents \
    hawk \
    README.md \
    pyproject.toml \
    uv.lock \
    services/modules/${SERVICE_NAME}/pyproject.toml \
    services/modules/${SERVICE_NAME}/uv.lock \
    ./

WORKDIR /source/services/modules/${SERVICE_NAME}
RUN --mount=type=cache,target=/root/.cache/uv \
    uv export \
        --frozen \
        --no-dev \
        --no-editable \
        --no-emit-project \
    | uv pip install \
        --requirement /dev/stdin \
        --target "${LAMBDA_TASK_ROOT}"

FROM builder AS builder-test
RUN --mount=type=cache,target=/root/.cache/uv \
    uv export \
        --extra dev \
        --frozen \
        --no-editable \
        --no-emit-project \
    | uv pip install \
        --requirement /dev/stdin \
        --target "${LAMBDA_TASK_ROOT}"

FROM public.ecr.aws/lambda/python:${PYTHON_VERSION}@${PYTHON_DIGEST} AS base
COPY --from=builder ${LAMBDA_TASK_ROOT} ${LAMBDA_TASK_ROOT}

ARG SERVICE_NAME
COPY services/modules/${SERVICE_NAME}/${SERVICE_NAME} ${LAMBDA_TASK_ROOT}/${SERVICE_NAME}

FROM base AS test
COPY --from=builder-test ${LAMBDA_TASK_ROOT} ${LAMBDA_TASK_ROOT}
COPY services/modules/${SERVICE_NAME}/tests ${LAMBDA_TASK_ROOT}/tests

ENV PYTHONPATH="${LAMBDA_TASK_ROOT}"
ENTRYPOINT ["python", "-m"]
CMD ["pytest", "tests"]

FROM base AS prod

# Can't use arg or env in CMD, so set symlink to static src
RUN ln -s ${LAMBDA_TASK_ROOT}/${SERVICE_NAME} ${LAMBDA_TASK_ROOT}/src
CMD ["src.index.handler"]
