# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

# Build context for this Dockerfile is the repository root (NOT web/), so
# that the consolidated scripts/ci/third-party-licenses.sh and its renderer
# are reachable. See .github/actions/utils/docker-buildx/action.yml.

FROM node:lts-alpine AS deps
WORKDIR /app
COPY web/package*.json ./
RUN npm ci --prefer-offline --no-audit

FROM node:lts-alpine AS builder
WORKDIR /app

# bash required by scripts/ci/third-party-licenses.sh; node:lts-alpine
# ships only ash by default. curl + tar used to fetch cargo-about
# (third-party-licenses.sh autodetects rust manifests vs node manifest;
# the web Dockerfile only feeds it a node manifest, so cargo-about is
# not actually invoked here, but bash is.)
RUN apk add --no-cache bash

COPY --from=deps /app/node_modules ./node_modules
COPY web/ ./

RUN npm run build

# Generate LICENSE-binary for the production npm dependencies bundled
# into this image. Required by ASF release policy: convenience binaries
# that bundle third-party code MUST include the full license text of
# every bundled package inside the artifact. Uses the same consolidated
# script and SPDX allow-list that the pre-merge `--validate` gate uses,
# so the published image cannot diverge from policy.
COPY scripts/ci/third-party-licenses.sh /opt/iggy/scripts/ci/third-party-licenses.sh
COPY scripts/ci/render-node-licenses.mjs /opt/iggy/scripts/ci/render-node-licenses.mjs
RUN /opt/iggy/scripts/ci/third-party-licenses.sh --generate \
      --manifest /app \
      --output /app/LICENSE-binary

FROM node:lts-alpine AS production

WORKDIR /app

COPY web/package*.json ./
RUN npm ci --production --prefer-offline --no-audit

COPY --from=builder /app/build ./build
COPY --from=builder /app/LICENSE-binary /usr/share/doc/iggy-web-ui/LICENSE-binary
COPY LICENSE NOTICE /usr/share/doc/iggy-web-ui/
USER node

EXPOSE 3050

ENV PORT=3050
ENV NODE_ENV=production

CMD ["node", "build"]
