# Stage 1: Build
FROM golang:1.23-alpine AS builder

ARG APP_VERSION=""

RUN apk add --no-cache git ca-certificates

WORKDIR /build

# Copy go modules and download dependencies
COPY go.mod go.sum ./
RUN go mod download && go mod verify

# Copy source code and static assets
COPY cmd/ cmd/
COPY lib/ lib/
COPY static/ static/
COPY templates/ templates/

# Build the binary
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o warpbox ./cmd/

# Stage 2: Runtime
FROM alpine:3.21

ARG APP_VERSION=""
ENV APP_VERSION=${APP_VERSION}

RUN apk add \
    --no-cache \
    ca-certificates \
    tzdata \
    wget

# Create non-root user
RUN addgroup -S warpbox && adduser -S warpbox -G warpbox

WORKDIR /app

# Copy binary from builder
COPY --from=builder /build/warpbox .

# Copy static assets
COPY --from=builder /build/static/ static/
COPY --from=builder /build/templates/ templates/

# Create data directory
RUN mkdir -p /app/data/uploads /app/data/db && chown -R warpbox:warpbox /app/data

# Switch to non-root user
USER warpbox

# Environment variables
ENV WARPBOX_DATA_DIR=/app/data \
    WARPBOX_GUEST_UPLOADS_ENABLED=true \
    WARPBOX_API_ENABLED=true \
    WARPBOX_ZIP_DOWNLOADS_ENABLED=true \
    WARPBOX_ONE_TIME_DOWNLOADS_ENABLED=true \
    WARPBOX_ONE_TIME_DOWNLOAD_EXPIRY_SECONDS=604800 \
    WARPBOX_ONE_TIME_DOWNLOAD_RETRY_ON_FAILURE=false \
    WARPBOX_ADMIN_ENABLED=true \
    WARPBOX_GLOBAL_MAX_FILE_SIZE_GB=2 \
    WARPBOX_GLOBAL_MAX_BOX_SIZE_GB=4 \
    WARPBOX_DEFAULT_GUEST_EXPIRY_SECONDS=3600 \
    WARPBOX_MAX_GUEST_EXPIRY_SECONDS=172800 \
    WARPBOX_BOX_POLL_INTERVAL_MS=5000 \
    WARPBOX_THUMBNAIL_BATCH_SIZE=10 \
    WARPBOX_THUMBNAIL_INTERVAL_SECONDS=30

EXPOSE 8080

HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \
  CMD wget -qO- http://127.0.0.1:8080/health >/dev/null || exit 1

VOLUME ["/app/data"]

CMD ["./warpbox", "run", "--addr", ":8080"]
