FROM ubuntu:24.04

WORKDIR /app
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
ENV PYBLOCK_PORT=6969

RUN apt-get update \
    && apt-get install -y --no-install-recommends \
       build-essential cmake git libjson-c-dev libwebsockets-dev \
       python3 python3-pip python3-venv \
       curl jq wget \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

# Pin ttyd to a specific release tag for reproducibility
RUN git clone --branch 1.7.7 --depth 1 https://github.com/tsl0922/ttyd.git \
    && cd ttyd \
    && mkdir build \
    && cd build \
    && cmake .. \
    && make \
    && make install \
    && cd /app && rm -rf ttyd

RUN apt-get update \
    && apt-get install -y --no-install-recommends \
       python3-dev libgmp-dev libffi-dev \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

# Install bitcoin-cli (Bitcoin Knots, not Core — same RPC protocol, different
# project) and lncli so PyBLOCK's mode A/B can talk to Umbrel's Bitcoin and
# LND containers over RPC/gRPC without a degraded Lite Mode fallback. The
# binaries are wrapped by umbrel/{bitcoin-cli,lncli}-wrapper.sh (installed
# below) which inject the connection details Umbrel injects via env vars.
ARG TARGETARCH
ARG KNOTS_VERSION=28.1.knots20250305
ARG KNOTS_SERIES=28.x
ARG LND_VERSION=v0.20.1-beta
RUN set -eux; \
    case "${TARGETARCH}" in \
        amd64) BTC_ARCH=x86_64-linux-gnu; LND_ARCH=amd64 ;; \
        arm64) BTC_ARCH=aarch64-linux-gnu; LND_ARCH=arm64 ;; \
        *) echo "Unsupported TARGETARCH: ${TARGETARCH}" >&2; exit 1 ;; \
    esac; \
    cd /tmp; \
    wget -q "https://bitcoinknots.org/files/${KNOTS_SERIES}/${KNOTS_VERSION}/bitcoin-${KNOTS_VERSION}-${BTC_ARCH}.tar.gz"; \
    wget -q "https://bitcoinknots.org/files/${KNOTS_SERIES}/${KNOTS_VERSION}/SHA256SUMS"; \
    grep "bitcoin-${KNOTS_VERSION}-${BTC_ARCH}.tar.gz" SHA256SUMS | sha256sum -c -; \
    tar -xzf "bitcoin-${KNOTS_VERSION}-${BTC_ARCH}.tar.gz" "bitcoin-${KNOTS_VERSION}/bin/bitcoin-cli"; \
    install -m 0755 "bitcoin-${KNOTS_VERSION}/bin/bitcoin-cli" /usr/local/bin/bitcoin-cli.bin; \
    rm -rf "bitcoin-${KNOTS_VERSION}" "bitcoin-${KNOTS_VERSION}-${BTC_ARCH}.tar.gz" SHA256SUMS; \
    wget -q "https://github.com/lightningnetwork/lnd/releases/download/${LND_VERSION}/lnd-linux-${LND_ARCH}-${LND_VERSION}.tar.gz"; \
    tar -xzf "lnd-linux-${LND_ARCH}-${LND_VERSION}.tar.gz" --strip-components=1 "lnd-linux-${LND_ARCH}-${LND_VERSION}/lncli"; \
    install -m 0755 lncli /usr/local/bin/lncli.bin; \
    rm -f lncli "lnd-linux-${LND_ARCH}-${LND_VERSION}.tar.gz"

RUN python3 -m venv /app/venv
ENV PATH="/app/venv/bin:$PATH"

# Copy project files
COPY requirements.txt /app/pyblock/requirements.txt
RUN pip install --no-cache-dir --upgrade pip \
    && pip install --no-cache-dir -r /app/pyblock/requirements.txt

COPY . /app/pyblock/

# Install the bitcoin-cli / lncli wrappers as the default CLI paths so any
# subprocess call to bitcoin-cli / lncli (including PyBLOCK's mode A/B menus)
# is transparently routed through RPC/gRPC against the Umbrel dependency
# containers. The real binaries live at /usr/local/bin/{bitcoin-cli,lncli}.bin.
RUN install -m 0755 /app/pyblock/umbrel/bitcoin-cli-wrapper.sh /usr/local/bin/bitcoin-cli \
    && install -m 0755 /app/pyblock/umbrel/lncli-wrapper.sh /usr/local/bin/lncli

# Entrypoint for auto-configuration
COPY entrypoint.sh /app/entrypoint.sh
RUN chmod +x /app/entrypoint.sh

# Create config volume mount point
RUN mkdir -p /app/pyblock/pybitblock/config

# Pin pyblock to UID/GID 1000 so it matches the user Umbrel forces via
# `user: "1000:1000"` in docker-compose. The base ubuntu:24.04 image ships an
# `ubuntu` user already at 1000, so remove it first to free the UID.
RUN userdel -r ubuntu 2>/dev/null || true \
    && groupadd -g 1000 pyblock \
    && useradd -m -s /bin/bash -u 1000 -g 1000 pyblock \
    && chown -R pyblock:pyblock /app

USER pyblock

EXPOSE 6969

HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
    CMD curl -f http://localhost:${PYBLOCK_PORT:-6969}/ || exit 1

ENTRYPOINT ["/app/entrypoint.sh"]
