# syntax=docker/dockerfile:1

FROM --platform=$BUILDPLATFORM node:24-bookworm-slim AS npm-builder

RUN apt-get update && apt-get install -y --no-install-recommends gettext-base \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /build/npm/wrapper
COPY packaging/npm/wrapper/package.json packaging/npm/wrapper/package-lock.json ./
RUN npm ci --ignore-scripts --no-audit --no-fund
COPY packaging/npm/wrapper/tsconfig.json ./
COPY packaging/npm/wrapper/src/ ./src/
RUN npm run build

COPY packaging/npm/base.package.json.tmpl /build/npm/
COPY packaging/npm/platform.package.json.tmpl /build/npm/
COPY packaging/npm/README.md /build/npm/README.md
COPY LICENSE /build/LICENSE

FROM npm-builder AS npm-base-assembler

ARG NODE_VERSION
ARG RELEASE_TAG
ARG ARTIFACT_VERSION
ARG RELEASE_BASE_URL

RUN set -eux; \
    for directory in trylle-cli trylle-cli-scoped; do \
        mkdir -p "/output/npm/${directory}"; \
        cp -R /build/npm/wrapper/lib "/output/npm/${directory}/lib"; \
        cp /build/npm/README.md "/output/npm/${directory}/README.md"; \
        cp /build/LICENSE "/output/npm/${directory}/LICENSE"; \
    done; \
    export node_version="${NODE_VERSION}" \
        release_tag="${RELEASE_TAG}" \
        artifact_version="${ARTIFACT_VERSION}" \
        release_base_url="${RELEASE_BASE_URL}"; \
    export node_pkg="trylle-cli" platform_pkg_prefix="trylle-cli"; \
    envsubst '${node_pkg} ${node_version} ${platform_pkg_prefix} ${release_tag} ${artifact_version} ${release_base_url}' \
        < /build/npm/base.package.json.tmpl \
        > /output/npm/trylle-cli/package.json; \
    export node_pkg="@trylle/trylle-cli" platform_pkg_prefix="@trylle/trylle-cli"; \
    envsubst '${node_pkg} ${node_version} ${platform_pkg_prefix} ${release_tag} ${artifact_version} ${release_base_url}' \
        < /build/npm/base.package.json.tmpl \
        > /output/npm/trylle-cli-scoped/package.json

FROM scratch AS npm-base-output
COPY --from=npm-base-assembler /output/npm/ /npm/

FROM npm-builder AS npm-platform-assembler

ARG PLATFORM
ARG NODE_OS
ARG NODE_ARCH
ARG NODE_VERSION

COPY packaging/binaries/ /build/binaries/

RUN set -eux; \
    source_binary="/build/binaries/trylle-cli-${PLATFORM}"; \
    test -f "${source_binary}"; \
    for directory in "trylle-cli-${PLATFORM}" "trylle-cli-scoped-${PLATFORM}"; do \
        mkdir -p "/output/npm/${directory}/bin"; \
        cp "${source_binary}" "/output/npm/${directory}/bin/trylle-cli"; \
        chmod 0755 "/output/npm/${directory}/bin/trylle-cli"; \
        cp /build/LICENSE "/output/npm/${directory}/LICENSE"; \
    done; \
    export node_version="${NODE_VERSION}" node_os="${NODE_OS}" node_arch="${NODE_ARCH}"; \
    export node_pkg="trylle-cli-${PLATFORM}"; \
    envsubst '${node_pkg} ${node_version} ${node_os} ${node_arch}' \
        < /build/npm/platform.package.json.tmpl \
        > "/output/npm/trylle-cli-${PLATFORM}/package.json"; \
    export node_pkg="@trylle/trylle-cli-${PLATFORM}"; \
    envsubst '${node_pkg} ${node_version} ${node_os} ${node_arch}' \
        < /build/npm/platform.package.json.tmpl \
        > "/output/npm/trylle-cli-scoped-${PLATFORM}/package.json"

FROM scratch AS npm-platform-output
COPY --from=npm-platform-assembler /output/npm/ /npm/

FROM python:3.12-slim AS pypi-builder

RUN pip install --no-cache-dir build==1.5.0 hatchling==1.32.0

WORKDIR /build/pypi/trylle-cli
COPY packaging/pypi/trylle-cli/ ./
COPY packaging/binaries/ /build/binaries/
COPY LICENSE ./LICENSE

ARG PYPI_PLATFORM
ARG VERSION

RUN sed -i "s/^version = \"[^\"]*\"/version = \"${VERSION}\"/" pyproject.toml \
    && sed -i "s/^__version__ = \"[^\"]*\"/__version__ = \"${VERSION}\"/" src/trylle_cli/__init__.py \
    && TRYLLE_CLI_PLATFORM="${PYPI_PLATFORM}" python -m build --wheel --no-isolation \
    && mkdir -p /output/pypi \
    && cp dist/*.whl /output/pypi/

FROM scratch AS pypi-output
COPY --from=pypi-builder /output/pypi/ /pypi/
