# Use build arguments for Go version and architecture
ARG GO_VERSION=1.22
ARG BUILDARCH=amd64

# Stage 1: Builder Stage
# FROM golang:${GO_VERSION}-alpine AS builder
FROM crazymax/xgo:${GO_VERSION} AS builder-backend

# Set up working directory
WORKDIR /app

# Step 1: Copy the source code
COPY . .

# Step 2: Download dependencies
RUN go mod tidy && go mod download


# Step 3: Install swag and  Run the build script
RUN go install github.com/swaggo/swag/cmd/swag@latest && \
    swag init -g cmd/apimain.go --output docs/api --instanceName api --exclude http/controller/admin && \
    swag init -g cmd/apimain.go --output docs/admin --instanceName admin --exclude http/controller/api

# Build the Go application with CGO enabled and specified ldflags
RUN CGO_ENABLED=1 GOOS=linux go build -a \
    -ldflags "-s -w --extldflags '-static -fpic'" \
    -installsuffix cgo -o release/apimain cmd/apimain.go

# Stage 2: Frontend Build Stage (builder2)
FROM node:18-alpine AS builder-admin-frontend

# Set working directory
WORKDIR /frontend

RUN apk update && apk add git --no-cache

# Clone the frontend repository
RUN git clone https://github.com/lejianwen/rustdesk-api-web .

# Install npm dependencies and build the frontend
RUN npm install && npm run build

# Stage 2: Final Image
FROM alpine:latest

# Set up working directory
WORKDIR /app

# Install necessary runtime dependencies
RUN apk add --no-cache tzdata file

# Copy the built application and resources from the builder stage
COPY --from=builder-backend /app/release /app/
COPY --from=builder-backend /app/conf /app/conf/
COPY --from=builder-backend /app/resources /app/resources/
COPY --from=builder-backend /app/docs /app/docs/
# Copy frontend build from builder2 stage
COPY --from=builder-admin-frontend /frontend/dist/ /app/resources/admin/

# Ensure the binary is correctly built and linked
RUN file /app/apimain && \
    mkdir -p /app/data && \
    mkdir -p /app/runtime

# Set up a volume for persistent data
VOLUME /app/data

# Expose the necessary port
EXPOSE 21114

# Define the command to run the application
CMD ["./apimain"]