# Multi-stage Dockerfile for {{APP_NAME}}, generated by `spry docker`.
#
# Expected build context layout (assembled by `spry docker --stack-dir`):
#   invercargill/                ← Web-Stack/Invercargill
#   invercargill-json/           ← Web-Stack/Invercargill-Json
#   astralis/                    ← Web-Stack/astralis
#   invercargill-sql/            ← Web-Stack/Invercargill-Sql
#   invercargill-sql-inversion/  ← Web-Stack/Invercargill-Sql-Inversion
#   statum/                      ← Web-Stack/Statum
#   spry/                        ← Web-Stack/Spry
#   app/                         ← this application
# The Web-Stack trees carry fixes not present on their remotes, so every
# stack library is COPYed from the local checkout instead of cloned. Only
# inversion is not part of Web-Stack; it is cloned below, pinned to a
# reviewed commit.

# Base image pinned by digest (docker.io/library/fedora:43 at generation
# time); refresh with `skopeo inspect docker://docker.io/library/fedora:43`
# and update both FROM lines.
FROM docker.io/library/fedora:43@sha256:a651ddf48ea28a06ed4e1e6519f51c9f47e7a5a138722ade87369b8fbb7e5b42 AS builder

# Install build dependencies
RUN dnf install -y \
    meson \
    ninja-build \
    gcc \
    vala \
    glib2-devel \
    gobject-introspection-devel \
    json-glib-devel \
    libxml2-devel \
    zlib-devel \
    libzstd-devel \
    libgee-devel \
    brotli-devel \
    libmicrohttpd-devel \
    libsodium-devel \
    sqlite-devel \
    git \
    pkg-config \
    && dnf clean all

# --- invercargill (COPYed; meson project lives in src/) ------------------------

COPY invercargill /build/invercargill
RUN meson setup invercargill/src invercargill/builddir --prefix=/usr && \
    ninja -C invercargill/builddir && \
    ninja -C invercargill/builddir install

# --- invercargill-json (COPYed; meson project lives in src/) -------------------

COPY invercargill-json /build/invercargill-json
RUN meson setup invercargill-json/src invercargill-json/builddir --prefix=/usr && \
    ninja -C invercargill-json/builddir && \
    ninja -C invercargill-json/builddir install

# --- inversion (cloned; the one dependency outside Web-Stack) ------------------
# Pinned to a reviewed commit — bump it in lockstep with the local checkout
# at ~/Projects/inversion when it changes.

RUN git clone https://fabrica.unitatem.net/Tilo15/inversion.git inversion && \
    cd inversion && \
    git checkout fc350827451e2c95af4d8e86d3ab5386e1e1a756 && \
    meson setup . builddir --prefix=/usr && \
    ninja -C builddir && \
    ninja -C builddir install

# --- astralis (COPYed) ----------------------------------------------------------

COPY astralis /build/astralis
RUN meson setup astralis astralis/builddir --prefix=/usr && \
    ninja -C astralis/builddir && \
    ninja -C astralis/builddir install

# --- invercargill-sql (COPYed) --------------------------------------------------

COPY invercargill-sql /build/invercargill-sql
RUN meson setup invercargill-sql invercargill-sql/builddir --prefix=/usr && \
    ninja -C invercargill-sql/builddir && \
    ninja -C invercargill-sql/builddir install

# --- invercargill-sql-inversion (COPYed) ----------------------------------------

COPY invercargill-sql-inversion /build/invercargill-sql-inversion
RUN meson setup invercargill-sql-inversion invercargill-sql-inversion/builddir --prefix=/usr && \
    ninja -C invercargill-sql-inversion/builddir && \
    ninja -C invercargill-sql-inversion/builddir install

# --- statum (COPYed) ------------------------------------------------------------

COPY statum /build/statum
RUN meson setup statum statum/builddir --prefix=/usr && \
    ninja -C statum/builddir && \
    ninja -C statum/builddir install

# --- spry (COPYed) --------------------------------------------------------------

COPY spry /build/spry
RUN meson setup spry spry/builddir --prefix=/usr && \
    ninja -C spry/builddir && \
    ninja -C spry/builddir install

# --- The application ------------------------------------------------------------
# web-config.json is excluded from the context by .dockerignore — keys are
# never baked into the image (mount the config at runtime; see README.md).

COPY app /build/app
RUN meson setup app app/builddir --prefix=/usr && \
    ninja -C app/builddir && \
    ninja -C app/builddir install

# --- Runtime ---------------------------------------------------------------------

# Same pinned base as the builder stage.
FROM docker.io/library/fedora:43@sha256:a651ddf48ea28a06ed4e1e6519f51c9f47e7a5a138722ade87369b8fbb7e5b42 AS runtime

# Install runtime dependencies only
RUN dnf install -y \
    glib2 \
    json-glib \
    libxml2 \
    zlib \
    libzstd \
    brotli \
    libmicrohttpd \
    libgee \
    libsodium \
    sqlite \
    && dnf clean all

# Copy built libraries and the application binary from the builder
COPY --from=builder /usr/lib64/libinvercargill*.so* /usr/lib64/
COPY --from=builder /usr/lib64/libinvercargill-json*.so* /usr/lib64/
COPY --from=builder /usr/lib64/libinversion*.so* /usr/lib64/
COPY --from=builder /usr/lib64/libastralis*.so* /usr/lib64/
COPY --from=builder /usr/lib64/libstatum*.so* /usr/lib64/
COPY --from=builder /usr/lib64/libspry*.so* /usr/lib64/
COPY --from=builder /usr/lib64/girepository-1.0/ /usr/lib64/girepository-1.0/
COPY --from=builder /usr/bin/{{APP_NAME}} /usr/bin/

# Persistent state lives outside /app: the SQLite store in a named volume,
# configuration bind-mounted read-only at runtime (see README.md).
ENV SPRY_DB_PATH=/var/lib/{{APP_NAME}}/{{APP_NAME}}.sqlite
VOLUME /var/lib/{{APP_NAME}}
WORKDIR /app
RUN ldconfig

# Expose the default port and run the application
EXPOSE 8080
CMD ["{{APP_NAME}}", "8080"]
