# =============================================================================
# Mergin Maps Mobile - Multi-stage Dockerfile (Podman Optimized)
# =============================================================================
# This Dockerfile builds the Mergin Maps Mobile application using a multi-stage
# approach optimized for Podman with external dependencies managed via variables.
#
# Build Command:
# podman build  --network=host -t mergin-maps:<TAG> .
#
# Output:
# The final APK will be available at:
# /var/www/ratp-qt/build/app/android-build/build/outputs/apk/release/android-build-release.apk
# =============================================================================

# =============================================================================
# STAGE 1: BASE - Environment and Dependencies Setup
# =============================================================================
FROM ubuntu:24.04 AS base

# Set working directory
WORKDIR "/var/www/mergin-maps"

# Install system dependencies
RUN apt-get update \
    && apt-get install -y \
        bash \
        zsh \
        nano \
        cmake \
        gcc \
        g++ \
        ninja-build \
        openjdk-17-jdk \
        wget \
        build-essential \
        zlib1g-dev \
        libstdc++6 \
        curl \
        unzip \
        zip \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

# Install Python pip properly to avoid RECORD file issues
RUN apt-get update \
    && apt-get install -y python3-pip \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

ARG QT_VERSION=6.6.3
ARG ZIP_URL
RUN set -eux; \
    : "${ZIP_URL:?Build arg ZIP_URL is required}"; \
    curl -fsSL -o /tmp/qt-dependencies.zip "${ZIP_URL}"
RUN set -eux; \
    unzip -q /tmp/qt-dependencies.zip -d /tmp; \
    mkdir -p /root/Qt; \
    if [ -d "/tmp/deps/qt/${QT_VERSION}" ]; then \
      mv "/tmp/deps/qt/${QT_VERSION}" "/root/Qt/${QT_VERSION}"; \
    else \
      echo "Qt directory not found inside archive"; \
      ls -la /tmp/deps || true; \
      exit 1; \
    fi; \
    rm -rf /tmp/deps /tmp/qt-dependencies.zip

# =============================================================================
# STAGE 2: FINAL - Application Build
# =============================================================================
FROM base AS final

# Set Android SDK environment variables
ENV ANDROID_SDK_ROOT="/usr/local/android-sdk"
ENV ANDROID_NDK_ROOT="$ANDROID_SDK_ROOT/ndk/27.1.12297006"
ENV PATH="$ANDROID_SDK_ROOT/cmdline-tools/latest/bin:$ANDROID_SDK_ROOT/platform-tools:$ANDROID_NDK_ROOT:$PATH"
ENV QT_BASE="/root/Qt/${QT_VERSION}"
ENV ANDROID_NDK_PLATFORM="android-34"

# Install Android SDK command-line tools
RUN mkdir -p ${ANDROID_SDK_ROOT}/cmdline-tools && \
    curl -L ${ANDROID_SDK_URL}/cmdline-tools.zip -o cmdline-tools.zip && \
    unzip cmdline-tools.zip -d ${ANDROID_SDK_ROOT}/cmdline-tools && \
    rm cmdline-tools.zip

# Ensure SDK manager is executable
RUN chmod +x ${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin/sdkmanager

# Accept licenses and install required Android SDK packages
RUN yes | ${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin/sdkmanager --licenses

# Install Android SDK components
RUN ${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin/sdkmanager --install \
    "platform-tools" \
    "platforms;android-34" \
    "build-tools;34.0.0" \
    "ndk;27.1.12297006"

# Verify Android SDK installation
RUN ${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin/sdkmanager --list

# Setup Input SDK directory
RUN mkdir -p /root/input-sdk
ENV INPUT_SDK_ANDROID_BASE=/root/input-sdk

# Download and extract ARM SDK
RUN wget -q ${MERGIN_SDK_ARM_URL} -O arm-android.tar.gz && \
    mkdir -p arm-android && \
    tar -xzf arm-android.tar.gz -C arm-android && \
    mv arm-android ${INPUT_SDK_ANDROID_BASE}/ && \
    rm arm-android.tar.gz

# Download and extract ARM64 SDK
RUN wget -q ${MERGIN_SDK_ARM64_URL} -O arm64-android.tar.gz && \
    mkdir -p arm64-android && \
    tar -xzf arm64-android.tar.gz -C arm64-android && \
    mv arm64-android ${INPUT_SDK_ANDROID_BASE}/ && \
    rm arm64-android.tar.gz

# Clean up large static libraries to reduce image size
RUN find ${INPUT_SDK_ANDROID_BASE} -name "*.a" -size +10M -delete || true

# Install SDKMAN and Gradle
RUN curl -s "${SDKMAN_URL}" | bash && \
    SDKMAN_API_URL="${SDKMAN_API_URL}" bash -c "source $HOME/.sdkman/bin/sdkman-init.sh && sdk install gradle"

# Copy project source code
COPY . /var/www/mergin-maps

# Create build directory
RUN mkdir -p /var/www/mergin-maps/build

# Set working directory for build
WORKDIR /var/www/mergin-maps/build

# Clean any existing build artifacts
RUN rm -rf CMakeCache.txt CMakeFiles/

# Configure project with CMake
RUN cmake \
    -DCMAKE_BUILD_TYPE=Debug \
    -DQT_ANDROID_ABIS="arm64-v8a" \
    -DQT_HOST_PATH=/root/Qt/${QT_VERSION}/gcc_64 \
    -DQT_HOST_PATH_CMAKE_DIR=/root/Qt/${QT_VERSION}/gcc_64/lib/cmake \
    -DCMAKE_TOOLCHAIN_FILE=/root/Qt/${QT_VERSION}/android_arm64_v8a/lib/cmake/Qt6/qt.toolchain.cmake \
    -DUSE_MM_SERVER_API_KEY=FALSE \
    -GNinja \
    ..

# Build APK using Ninja
RUN ninja apk

# Copy keystore file for signing
COPY docker_resources/mergin_android.jks /var/www/mergin-maps/build/app/android-build

# Set working directory to Android build directory
WORKDIR /var/www/mergin-maps/build/app/android-build

# Clean and assemble release APK
RUN chmod +x ./gradlew && \
    ./gradlew clean && \
    ./gradlew assembleRelease

# Clean up build artifacts to reduce image size
RUN find /var/www/mergin-maps/build -name "*.o" -delete || true && \
    find /var/www/mergin-maps/build -name "*.so" -delete || true && \
    find /var/www/mergin-maps/build -name "CMakeFiles" -type d -exec rm -rf {} + || true

# =============================================================================
# FINAL APK LOCATION:
# /var/www/mergin-maps/build/app/android-build/build/outputs/apk/release/android-build-release.apk
# =============================================================================

# Add metadata labels for better image management
LABEL maintainer="Mergin Maps Team"
LABEL description="Mergin Maps Mobile Application - Multi-stage build (Podman Optimized)"
LABEL version="1.0.0"
LABEL build-date="$(date -u +'%Y-%m-%dT%H:%M:%SZ')"
LABEL container-runtime="podman"
