FROM python:3.11-slim-bookworm as python-base

ENV PYTHONUNBUFFERED=1 \
    PYTHONDONTWRITEBYTECODE=1 \
    PIP_NO_CACHE_DIR=off \
    PIP_DISABLE_PIP_VERSION_CHECK=on \
    PIP_DEFAULT_TIMEOUT=100 \
    POETRY_VERSION=1.8.3 \
    POETRY_HOME="/opt/poetry" \
    POETRY_VIRTUALENVS_IN_PROJECT=true \
    POETRY_NO_INTERACTION=1 \
    PYSETUP_PATH="/opt/pysetup" \
    VENV_PATH="/opt/pysetup/.venv"

ENV PATH="$POETRY_HOME/bin:$VENV_PATH/bin:$PATH"


FROM python-base as builder-base
RUN apt-get update \
    && apt-get install --no-install-recommends -y curl wget unzip build-essential

RUN curl -sSL https://install.python-poetry.org | python3 -

WORKDIR $PYSETUP_PATH
COPY poetry.lock pyproject.toml ./

RUN poetry install --no-dev --no-root

ADD scripts/download-bin.sh /

# Download sample binary file for dev / qa environments
RUN /download-bin.sh

# Download PROD binary file
ARG IP2LOCATION_DB_TOKEN
ARG IP2LOCATION_DB_CODE

ENV IP2LOCATION_DB_TOKEN=$IP2LOCATION_DB_TOKEN
ENV IP2LOCATION_DB_CODE=$IP2LOCATION_DB_CODE

RUN /download-bin.sh


FROM python-base as dev

WORKDIR $PYSETUP_PATH

COPY --from=builder-base $POETRY_HOME $POETRY_HOME
COPY --from=builder-base $PYSETUP_PATH $PYSETUP_PATH

RUN poetry install --no-root

WORKDIR /var/app

RUN ln -s $PYSETUP_PATH/data /var/data

EXPOSE 8080

CMD ["uvicorn", "location.api.asgi:app", "--reload", "--host=0.0.0.0", "--port=8080"]


FROM python-base as deploy

COPY --from=builder-base $PYSETUP_PATH $PYSETUP_PATH

# Install curl for ECS health check
RUN apt-get update \
    && apt-get install -y curl

ADD scripts/uvicorn-start.sh /
RUN chmod +x /uvicorn-start.sh

ADD . /var/app
WORKDIR /var/app

RUN ln -s $PYSETUP_PATH/data /var/data

ENTRYPOINT  ["/uvicorn-start.sh"]

EXPOSE 8080


FROM python-base as lint-and-test

WORKDIR $PYSETUP_PATH

COPY --from=builder-base $POETRY_HOME $POETRY_HOME
COPY --from=builder-base $PYSETUP_PATH $PYSETUP_PATH

RUN poetry install --no-root

ADD scripts/lint-and-test.sh /
RUN chmod +x /lint-and-test.sh

WORKDIR /var/app

RUN ln -s $PYSETUP_PATH/data /var/data

ENTRYPOINT  ["/lint-and-test.sh"]

