# Base image for building libraries
# ---------------------------------
FROM ubuntu:22.04 AS build-base

ARG DEBIAN_FRONTEND=noninteractive

# Install build tools and dependencies
RUN apt-get update \
  && apt-get install -y \
  build-essential \
  git \
  autoconf \
  automake \
  libtool-bin \
  pkg-config \
  libcurl4-openssl-dev \
  libusb-1.0-0-dev \
  libssl-dev \
  udev \
  && rm -rf /var/lib/apt/lists/*


# libplist
# --------
FROM build-base AS build-libplist

# Build
RUN git clone https://github.com/libimobiledevice/libplist && cd libplist \
  && ./autogen.sh && make -j "$(nproc)" && make install DESTDIR=/build \
  && cd .. && rm -rf libplist


# libimobiledevice-glue
# ---------------------
FROM build-base AS build-libimobiledevice-glue

# Install dependencies
COPY --from=build-libplist /build /

# Build
RUN git clone https://github.com/libimobiledevice/libimobiledevice-glue && cd libimobiledevice-glue \
  && ./autogen.sh && make -j "$(nproc)" && make install DESTDIR=/build \
  && cd .. && rm -rf libimobiledevice-glue


# libtatsu
# --------
FROM build-base AS build-libtatsu

# Install dependencies
COPY --from=build-libplist /build /

# Build
RUN git clone https://github.com/libimobiledevice/libtatsu && cd libtatsu \
  && ./autogen.sh && make -j "$(nproc)" && make install DESTDIR=/build \
  && cd .. && rm -rf libtatsu


# libusbmuxd
# ----------
FROM build-base AS build-libusbmuxd

# Install dependencies
COPY --from=build-libplist /build /
COPY --from=build-libimobiledevice-glue /build /

# Build
RUN git clone https://github.com/libimobiledevice/libusbmuxd && cd libusbmuxd \
  && ./autogen.sh && make -j "$(nproc)" && make install DESTDIR=/build \
  && cd .. && rm -rf libusbmuxd


# libimobiledevice
# ----------------
FROM build-base AS build-libimobiledevice

# Install dependencies
COPY --from=build-libplist /build /
COPY --from=build-libtatsu /build /
COPY --from=build-libimobiledevice-glue /build /
COPY --from=build-libusbmuxd /build /

# Build
RUN git clone https://github.com/libimobiledevice/libimobiledevice && cd libimobiledevice \
  && ./autogen.sh --enable-debug && make -j "$(nproc)" && make install DESTDIR=/build \
  && cd .. && rm -rf libimobiledevice


# usbmuxd
# -------
FROM build-base AS build-usbmuxd

# Install dependencies
COPY --from=build-libplist /build /
COPY --from=build-libimobiledevice-glue /build /
COPY --from=build-libusbmuxd /build /
COPY --from=build-libimobiledevice /build /

# Build
RUN git clone https://github.com/libimobiledevice/usbmuxd && cd usbmuxd \
  && ./autogen.sh --sysconfdir=/etc --localstatedir=/var --runstatedir=/run && make -j "$(nproc)" && make install DESTDIR=/build \
  && cd .. && rm -rf usbmuxd && mv /build/lib /build/usr/lib


# Main image
# ----------
FROM python:3.10.14-alpine3.20 AS main
COPY --from=ghcr.io/astral-sh/uv:0.11.8 /uv /uvx /usr/local/bin/

LABEL org.opencontainers.image.url="https://mvt.re"
LABEL org.opencontainers.image.documentation="https://docs.mvt.re"
LABEL org.opencontainers.image.source="https://github.com/mvt-project/mvt"
LABEL org.opencontainers.image.title="Mobile Verification Toolkit (iOS)"
LABEL org.opencontainers.image.description="MVT is a forensic tool to look for signs of infection in smartphone devices."
LABEL org.opencontainers.image.licenses="MVT License 1.1"
LABEL org.opencontainers.image.base.name=docker.io/library/python:3.10.14-alpine3.20

# Install runtime dependencies
RUN apk add --no-cache \
  gcompat \
  libcurl \
  libssl3 \
  libusb \
  sqlite
COPY --from=build-libplist /build /
COPY --from=build-libimobiledevice-glue /build /
COPY --from=build-libtatsu /build /
COPY --from=build-libusbmuxd /build /
COPY --from=build-libimobiledevice /build /
COPY --from=build-usbmuxd /build /

# Install mvt using the locally checked out source
COPY ./ mvt
RUN apk add --no-cache --virtual .build-deps git gcc musl-dev \
  && uv pip install --system --no-cache ./mvt \
  && apk del .build-deps git gcc musl-dev && rm -rf ./mvt

ENTRYPOINT [ "/usr/local/bin/mvt-ios" ]
