# ============================================================
# SmartStack Backend - Multi-stage build
# Image: smartstack-{project}-backend:{tag}
# ============================================================

# --- Stage 1: Build ---
FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
WORKDIR /src

# Copy Directory.Build.props (defines TargetFramework for all projects)
COPY Directory.Build.props /src/

# Copy project files for NuGet restore cache
COPY src/{{ProjectName}}.Domain/{{ProjectName}}.Domain.csproj {{ProjectName}}.Domain/
COPY src/{{ProjectName}}.Application/{{ProjectName}}.Application.csproj {{ProjectName}}.Application/
COPY src/{{ProjectName}}.Infrastructure/{{ProjectName}}.Infrastructure.csproj {{ProjectName}}.Infrastructure/
COPY src/{{ProjectName}}.Api/{{ProjectName}}.Api.csproj {{ProjectName}}.Api/

# Restore packages (cached layer)
RUN dotnet restore {{ProjectName}}.Api/{{ProjectName}}.Api.csproj

# Copy all source code
COPY src/{{ProjectName}}.Domain/ {{ProjectName}}.Domain/
COPY src/{{ProjectName}}.Application/ {{ProjectName}}.Application/
COPY src/{{ProjectName}}.Infrastructure/ {{ProjectName}}.Infrastructure/
COPY src/{{ProjectName}}.Api/ {{ProjectName}}.Api/

# Publish release build
RUN dotnet publish {{ProjectName}}.Api/{{ProjectName}}.Api.csproj \
    -c Release \
    -o /publish \
    --no-restore

# --- Stage 2: Runtime ---
FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS runtime

# Install curl for healthcheck (not available in aspnet base image)
RUN apt-get update && apt-get install -y --no-install-recommends curl && rm -rf /var/lib/apt/lists/*

WORKDIR /app

# Copy published app
COPY --from=build /publish/ ./

# Configure ports
#   5142 = API HTTP
#   5143 = WebSocket (SignalR)
#   8080 = Health check
EXPOSE 5142 5143 8080

ENV ASPNETCORE_URLS="http://+:5142;http://+:5143;http://+:8080"

# Health check (start-period=60s for SQL migrations)
HEALTHCHECK --interval=10s --timeout=5s --start-period=60s --retries=5 \
    CMD curl -sf http://localhost:8080/health || exit 1

# Run as non-root (built-in 'app' user in .NET 8+ images)
USER app

ENTRYPOINT ["dotnet", "{{ProjectName}}.Api.dll"]
