# Build stage
FROM golang:1.26-alpine AS builder

WORKDIR /app

# Install system tools (cached well)
RUN apk add --no-cache nodejs npm curl git

# Install Go tools (cached well)
RUN wget -O /tmp/sqlc.tar.gz https://github.com/sqlc-dev/sqlc/releases/download/v1.31.0/sqlc_1.31.0_linux_amd64.tar.gz && \
  tar -xzf /tmp/sqlc.tar.gz -C /usr/local/bin sqlc && \
  rm /tmp/sqlc.tar.gz
RUN --mount=type=cache,target=/root/go/pkg/mod \
  go install github.com/a-h/templ/cmd/templ@v0.3.1020

# Copy package files and install npm dependencies (cached unless package.json changes)
COPY package*.json ./
RUN --mount=type=cache,target=/root/.npm \
  npm install 

# Copy Go mod files (cached unless go.mod changes)
COPY go.mod go.sum ./
RUN --mount=type=cache,target=/root/go/pkg/mod \
  go mod download

# Copy source code (this layer changes frequently)
COPY . .

# Generate code (only these rebuild on source changes)
RUN cd internal/database && sqlc generate
RUN cd templates && templ generate

# Build frontend assets (only these rebuild on web/ changes)
RUN npm run build:css:prod
RUN npm run build:ts

# Build Go binary (cached unless Go files or generated code changes)
RUN --mount=type=cache,target=/root/go/pkg/mod \
  --mount=type=cache,target=/root/.cache/go-build \
  CGO_ENABLED=0 GOOS=linux go build -installsuffix cgo -o main ./cmd/server

# Test runner stage - includes Go runtime and test dependencies
# This stage is ONLY used for running tests, never deployed to production
FROM golang:1.26-alpine AS test-runner

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

WORKDIR /app

# Copy everything from builder (includes compiled binary, source code, and dependencies)
COPY --from=builder /app ./

# Install kepubify for conversion tests
RUN wget -O /usr/bin/kepubify https://github.com/pgaskin/kepubify/releases/latest/download/kepubify-linux-64bit \
  && chmod +x /usr/bin/kepubify

# Set test environment variables
ENV TEST_MODE=true
ENV RATE_LIMIT_ENABLED=false
ENV REQUESTS_PER_MINUTE=1000

# Default command for running tests
CMD ["go", "test", "./cmd/server/tests", "-v", "-timeout", "5m", "-parallel=1", "-short"]

# Final stage
FROM alpine:latest

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

# Install kepubify for EPUB→KEPUB conversion
RUN wget -O /usr/bin/kepubify https://github.com/pgaskin/kepubify/releases/latest/download/kepubify-linux-64bit \
  && chmod +x /usr/bin/kepubify

WORKDIR /root/

# Copy the binary from builder stage
COPY --from=builder /app/main .

# Copy database schema (if needed for initialization)
COPY --from=builder /app/database/schema ./database/schema

# Copy generated templates
COPY --from=builder /app/templates ./templates

# Copy web assets (HTML, CSS, JS, etc.)
COPY --from=builder /app/web ./web

# Copy documentation
COPY --from=builder /app/docs ./docs

# Expose port
EXPOSE 8765

# Run the binary
CMD ["./main"]
