FROM crystallang/crystal:1.9.2-alpine AS builder

# Install build dependencies
RUN apk add --no-cache \
    yaml-dev \
    openssl-dev \
    zlib-dev \
    sqlite-dev \
    postgresql-dev \
    git \
    curl

# Set build arguments
ARG APP_NAME=metrics-service
ARG BINARY_PATH=src/metrics_manager.cr

WORKDIR /app

# Copy shard files
COPY shard.yml shard.lock ./

# Install dependencies
RUN shards install --production

# Copy source code
COPY . .

# Build the binary
RUN crystal build --release --static ${BINARY_PATH} -o ${APP_NAME}

# Runtime stage
FROM alpine:3.19

# Install runtime dependencies
RUN apk add --no-cache \
    ca-certificates \
    tzdata \
    openssl \
    yaml

WORKDIR /app

# Copy the binary from builder
COPY --from=builder /app/${APP_NAME} .

# Create data directory for metrics and set permissions
RUN mkdir -p /data && \
    adduser -D appuser && \
    chown -R appuser:appuser /app /data && \
    find /app -type f -exec chmod 400 {} \; && \
    find /app -type d -exec chmod 500 {} \; && \
    chmod 500 /app/${APP_NAME} && \
    chmod 700 /data

USER appuser

# Set environment variables
ENV PORT=3000
ENV METRICS_PORT=9090
ENV KEMAL_ENV=production

# Volume for metrics data
VOLUME ["/data"]

# Expose ports
EXPOSE 3000 9090

ENTRYPOINT ["/app/metrics-service"]
