FROM node:18 as frontend

COPY ./site/frontend ./site/frontend
RUN cd site/frontend && npm ci --registry=https://registry.npmmirror.com
RUN cd site/frontend && npm run check
RUN cd site/frontend && npm run build

FROM ubuntu:20.04 as base

RUN mkdir -p $HOME/.cargo && \
    echo '[source.crates-io]\n\
replace-with = "ustc"\n\
\n\
[source.ustc]\n\
registry = "sparse+https://mirrors.ustc.edu.cn/crates.io-index/"' > $HOME/.cargo/config.toml

ENV CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse

RUN apt-get update -y && \
    DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
      g++ \
      curl \
      ca-certificates \
      libc6-dev \
      make \
      libssl-dev \
      pkg-config \
      git \
      cmake \
      zlib1g-dev

ENV RUSTUP_DIST_SERVER=https://mirrors.tuna.tsinghua.edu.cn/rustup
ENV RUSTUP_UPDATE_ROOT=https://mirrors.tuna.tsinghua.edu.cn/rustup/rustup

RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- \
    --default-toolchain stable --profile minimal -y

RUN bash -c 'source $HOME/.cargo/env && cargo install cargo-chef'

FROM base AS planner
COPY . .
RUN bash -c 'source $HOME/.cargo/env && cargo chef prepare --recipe-path recipe.json'

FROM base as build
COPY --from=planner recipe.json recipe.json

RUN bash -c 'source $HOME/.cargo/env && cargo chef cook --release --recipe-path recipe.json'

COPY ./Cargo.lock ./Cargo.lock
COPY ./Cargo.toml ./Cargo.toml
COPY ./collector ./collector
COPY ./database ./database
COPY ./intern ./intern
COPY ./site ./site
COPY --from=frontend ./site/frontend/dist ./site/frontend/dist

RUN bash -c 'source $HOME/.cargo/env && cargo build --release -p site'
RUN bash -c 'source $HOME/.cargo/env && cargo build --release --bin postgres-to-sqlite'

FROM ubuntu:20.04 as binary

RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \
    ca-certificates \
    git

WORKDIR /app

COPY --from=build /app/target/release/postgres-to-sqlite /app/rustc-perf-postgres-to-sqlite
COPY --from=build /app/target/release/site /app/rustc-perf-site

CMD ./rustc-perf-site