ARG NODE_VERSION=22-alpine@sha256:16e22a550f3863206a3f701448c45f7912c6896a62de43add43bb9c86130c3e2

# Stage 1: Install dependencies and build
FROM node:${NODE_VERSION} AS builder

ARG APP_VERSION
ENV VITE_APP_VERSION=${APP_VERSION}

# Pin to the version in package.json's packageManager field so the image build
# matches CI and the lockfile, rather than drifting to a newer pnpm major.
RUN corepack enable && corepack prepare pnpm@11.1.2 --activate

WORKDIR /src

# Workspace manifests first for cached installs.
COPY pnpm-workspace.yaml package.json pnpm-lock.yaml ./
COPY apps/console/package.json apps/console/
COPY packages/ui/package.json packages/ui/
COPY packages/types/package.json packages/types/
COPY packages/k8s-client/package.json packages/k8s-client/

RUN pnpm install --frozen-lockfile

COPY apps/console/ apps/console/
COPY packages/ packages/
COPY tsconfig.base.json ./

RUN pnpm --filter @cozystack/console build

# Stage 2: Serve with nginx
FROM nginxinc/nginx-unprivileged:1.29-alpine@sha256:0c79d56aee561a1d81c63f00eee5fb5fe29279560cdc55e91425133104c7fbe6

COPY --from=builder /src/apps/console/dist /usr/share/nginx/html

COPY <<'EOF' /etc/nginx/conf.d/default.conf
map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}

server {
    listen       8080 default_server;
    listen       [::]:8080 default_server;
    server_name  _;

    root /usr/share/nginx/html;
    index index.html;

    # Kubernetes API proxy for both core and aggregated groups.
    # Chunked-encoding watches require proxy_buffering off and a long timeout.
    location /apis {
        proxy_http_version 1.1;
        proxy_buffering off;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host kubernetes.default.svc;
        proxy_read_timeout 86400s;
        proxy_send_timeout 86400s;
        proxy_pass https://kubernetes.default.svc:443;
    }

    location /api {
        proxy_http_version 1.1;
        proxy_buffering off;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host kubernetes.default.svc;
        proxy_read_timeout 86400s;
        proxy_send_timeout 86400s;
        proxy_pass https://kubernetes.default.svc:443;
    }

    # /k8s prefix for VNC WebSocket compatibility
    location /k8s/ {
        proxy_http_version 1.1;
        proxy_buffering off;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host kubernetes.default.svc;
        proxy_read_timeout 86400s;
        proxy_send_timeout 86400s;
        rewrite /k8s/(.*) /$1 break;
        proxy_pass https://kubernetes.default.svc:443;
    }

    # SPA fallback: serve index.html for all frontend routes.
    location / {
        try_files $uri $uri/ /index.html;
    }

    location /healthcheck {
        access_log off;
        return 200 "Healthy\n";
    }
}
EOF

EXPOSE 8080
