# Frontend build stage
FROM --platform=$BUILDPLATFORM oven/bun:1.3.14-alpine AS frontend-builder

WORKDIR /app/frontend
COPY frontend/package.json frontend/bun.lock ./
RUN bun install --frozen-lockfile

COPY frontend/ ./
RUN bun run build

# Backend build stage
FROM --platform=$BUILDPLATFORM golang:1.26.5-alpine3.24 AS builder

RUN apk add --no-cache git

WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download

COPY . .

ARG TARGETOS
ARG TARGETARCH
ARG VERSION=1.0.0
ARG COMMIT=unknown
ARG BUILD_TIME=unknown

RUN CGO_ENABLED=0 GOOS=$TARGETOS GOARCH=$TARGETARCH go build \
    -ldflags="-s -w \
    -X github.com/livingkb/livingkb/internal/version.version=${VERSION} \
    -X github.com/livingkb/livingkb/internal/version.Commit=${COMMIT} \
    -X github.com/livingkb/livingkb/internal/version.BuildTime=${BUILD_TIME}" \
    -o /livingkb ./cmd/server


# Git runtime stage
FROM alpine/git:v2.54.0 AS git-env


# Runtime stage
FROM scratch

# Certificates & user database
COPY --from=git-env /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
COPY --from=git-env /etc/passwd /etc/passwd

# Shell for Git helper scripts
COPY --from=git-env /bin/busybox /bin/busybox
COPY --from=git-env /bin/sh /bin/sh

# Git & Git helper
COPY --from=git-env /usr/bin/git /usr/bin/git
COPY --from=git-env /usr/libexec/git-core /usr/libexec/git-core

# SSH client for Git SSH remote
COPY --from=git-env /usr/bin/ssh /usr/bin/ssh
COPY --from=git-env /usr/bin/ssh-keyscan /usr/bin/ssh-keyscan

# Multi-architecture musl loader:
# amd64: ld-musl-x86_64.so.1
# arm64: ld-musl-aarch64.so.1
COPY --from=git-env /lib/ld-musl-*.so.1 /lib/

# Git base dependencies
COPY --from=git-env /usr/lib/libpcre2-8.so.0 /usr/lib/
COPY --from=git-env /usr/lib/libz.so.1 /usr/lib/

# Git HTTP helper dependencies
COPY --from=git-env /usr/lib/libcurl.so.4 /usr/lib/
COPY --from=git-env /usr/lib/libexpat.so.1 /usr/lib/

# libcurl dependencies
COPY --from=git-env /usr/lib/libcares.so.2 /usr/lib/
COPY --from=git-env /usr/lib/libnghttp2.so.14 /usr/lib/
COPY --from=git-env /usr/lib/libidn2.so.0 /usr/lib/
COPY --from=git-env /usr/lib/libpsl.so.5 /usr/lib/
COPY --from=git-env /usr/lib/libssl.so.3 /usr/lib/
COPY --from=git-env /usr/lib/libcrypto.so.3 /usr/lib/
COPY --from=git-env /usr/lib/libzstd.so.1 /usr/lib/
COPY --from=git-env /usr/lib/libbrotlidec.so.1 /usr/lib/
COPY --from=git-env /usr/lib/libbrotlicommon.so.1 /usr/lib/
COPY --from=git-env /usr/lib/libunistring.so.5 /usr/lib/

# Application
COPY --from=builder /livingkb /app/livingkb
COPY --from=frontend-builder /app/frontend/dist /app/public
COPY migrations /app/migrations

ENV TZ=UTC
ENV PATH=/usr/bin:/bin
ENV GIT_EXEC_PATH=/usr/libexec/git-core

WORKDIR /app

EXPOSE 8080
ENTRYPOINT ["/app/livingkb"]