#!/bin/bash

# Build Android AAR with real compiled Rust libraries
set -e

PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
BUILD_DIR="$PROJECT_DIR/build/android"
AAR_DIR="$BUILD_DIR/aar"

echo "Building Android AAR with real Rust libraries..."

# Clean build directory
rm -rf "$BUILD_DIR"
mkdir -p "$BUILD_DIR"
mkdir -p "$AAR_DIR"

# Create AAR structure
mkdir -p "$AAR_DIR/META-INF"
mkdir -p "$AAR_DIR/classes/org/guardianproject/proofmode"
mkdir -p "$AAR_DIR/jni/arm64-v8a"
mkdir -p "$AAR_DIR/jni/armeabi-v7a"
mkdir -p "$AAR_DIR/jni/x86"
mkdir -p "$AAR_DIR/jni/x86_64"

# Create AndroidManifest.xml
cat > "$AAR_DIR/AndroidManifest.xml" << 'EOF'
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="org.guardianproject.proofmode">
    <uses-sdk android:minSdkVersion="21" />
</manifest>
EOF

# Check if libraries are built
echo "Checking for compiled libraries..."
ARM_LIBS_BUILT=true
for arch in aarch64-linux-android armv7-linux-androideabi; do
    if [ ! -f "$PROJECT_DIR/target/$arch/release/libproofmode.so" ]; then
        echo "Missing library for $arch"
        ARM_LIBS_BUILT=false
    fi
done

if [ "$ARM_LIBS_BUILT" = false ]; then
    echo "ARM libraries are not built. Please run: cargo make build-android"
    exit 1
fi

# Copy real compiled libraries
echo "Copying compiled Rust libraries..."
cp "$PROJECT_DIR/target/aarch64-linux-android/release/libproofmode.so" "$AAR_DIR/jni/arm64-v8a/"
cp "$PROJECT_DIR/target/armv7-linux-androideabi/release/libproofmode.so" "$AAR_DIR/jni/armeabi-v7a/"

# For x86 architectures, check if they exist, otherwise skip
if [ -f "$PROJECT_DIR/target/i686-linux-android/release/libproofmode.so" ]; then
    cp "$PROJECT_DIR/target/i686-linux-android/release/libproofmode.so" "$AAR_DIR/jni/x86/"
else
    echo "Note: x86 library not built, skipping..."
    rm -rf "$AAR_DIR/jni/x86"
fi

if [ -f "$PROJECT_DIR/target/x86_64-linux-android/release/libproofmode.so" ]; then
    cp "$PROJECT_DIR/target/x86_64-linux-android/release/libproofmode.so" "$AAR_DIR/jni/x86_64/"
else
    echo "Note: x86_64 library not built, skipping..."
    rm -rf "$AAR_DIR/jni/x86_64"
fi

# Check if Kotlin bindings exist
if [ -f "$PROJECT_DIR/bindings/android/generated/org/guardianproject/proofmode/ProofModeKt.kt" ]; then
    echo "Using generated UniFFI Kotlin bindings..."
    KOTLIN_FILE="$PROJECT_DIR/bindings/android/generated/org/guardianproject/proofmode/ProofModeKt.kt"
else
    echo "Warning: Generated Kotlin bindings not found. Using existing bindings..."
    KOTLIN_FILE="$PROJECT_DIR/bindings/android/org/guardianproject/proofmode/ProofMode.kt"
fi

# Compile Kotlin classes
echo "Compiling Kotlin bindings..."
cd "$BUILD_DIR"

# Check if we have kotlinc
if command -v kotlinc &> /dev/null; then
    # Copy Kotlin file to build directory
    mkdir -p org/guardianproject/proofmode
    cp "$KOTLIN_FILE" org/guardianproject/proofmode/
    
    # Try to find Android SDK
    ANDROID_JAR=""
    if [ -n "$ANDROID_HOME" ]; then
        ANDROID_JAR="$ANDROID_HOME/platforms/android-21/android.jar"
    elif [ -d "/Users/$(whoami)/Library/Android/sdk" ]; then
        ANDROID_JAR="/Users/$(whoami)/Library/Android/sdk/platforms/android-21/android.jar"
    elif [ -d "/opt/android-sdk" ]; then
        ANDROID_JAR="/opt/android-sdk/platforms/android-21/android.jar"
    fi
    
    if [ -f "$ANDROID_JAR" ]; then
        echo "Compiling with Android SDK..."
        kotlinc -cp "$ANDROID_JAR" -d "$AAR_DIR/classes" org/guardianproject/proofmode/*.kt
    else
        echo "Android SDK not found, compiling without it..."
        kotlinc -d "$AAR_DIR/classes" org/guardianproject/proofmode/*.kt
    fi
else
    echo "kotlinc not found. Copying pre-compiled classes if available..."
    # If we have pre-compiled classes from bindings, use them
    if [ -d "$PROJECT_DIR/bindings/android/classes" ]; then
        cp -r "$PROJECT_DIR/bindings/android/classes/"* "$AAR_DIR/classes/"
    else
        echo "Warning: No compiled classes available. AAR may not work properly."
    fi
fi

cd "$PROJECT_DIR"

# Create proguard.txt (empty for now)
touch "$AAR_DIR/proguard.txt"

# Create the AAR file
cd "$AAR_DIR"
echo "Creating AAR archive..."
zip -r "$PROJECT_DIR/android-example/app/libs/proofmode-rust.aar" .

cd "$PROJECT_DIR"
echo "Android AAR created at: android-example/app/libs/proofmode-rust.aar"

# Show library sizes for verification
echo ""
echo "Library sizes:"
for arch in arm64-v8a armeabi-v7a x86 x86_64; do
    size=$(ls -lh "$AAR_DIR/jni/$arch/libproofmode.so" | awk '{print $5}')
    echo "  $arch: $size"
done

echo ""
echo "AAR contents:"
unzip -l android-example/app/libs/proofmode-rust.aar | grep -E "(\.so|\.class|\.kt)" | head -20