#!/bin/bash

# Compile Kotlin bindings to Java bytecode
set -e

PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
BUILD_DIR="$PROJECT_DIR/build/kotlin"
KOTLIN_SRC="$PROJECT_DIR/bindings/android/generated/org/guardianproject/proofmode/ProofModeKt.kt"
OUTPUT_DIR="$PROJECT_DIR/bindings/android/classes"

echo "Compiling Kotlin bindings to bytecode..."

# Clean and create directories
rm -rf "$BUILD_DIR"
mkdir -p "$BUILD_DIR"
mkdir -p "$OUTPUT_DIR"

# Check if Kotlin source exists
if [ ! -f "$KOTLIN_SRC" ]; then
    echo "Error: Kotlin source not found at $KOTLIN_SRC"
    echo "Please run: cargo make generate-android-bindings"
    exit 1
fi

# Copy Kotlin source to build directory
cp -r "$PROJECT_DIR/bindings/android/generated/org" "$BUILD_DIR/"

# Since we don't have kotlinc, we'll create a minimal Java version of the bindings
echo "Creating Java version of bindings..."

cat > "$BUILD_DIR/ProofMode.java" << 'EOF'
package org.guardianproject.proofmode;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;

public class ProofMode {
    static {
        try {
            System.loadLibrary("proofmode");
        } catch (UnsatisfiedLinkError e) {
            android.util.Log.w("ProofMode", "Native library not loaded: " + e.getMessage());
        }
    }
    
    // Native methods
    public static native String generateProofMobile(byte[] mediaData, Map<String, String> metadata, long callbacksHandle);
    public static native String getFileHash(byte[] mediaData);
    public static native String getVersion();
    public static native String checkFilesMobile(String[] filePaths, long callbacksHandle);
    
    // Callback registry
    private static final ConcurrentHashMap<Long, MobileCallbacks> callbacks = new ConcurrentHashMap<>();
    private static final AtomicLong nextId = new AtomicLong(1);
    
    public static long registerCallback(MobileCallbacks callback) {
        long id = nextId.getAndIncrement();
        callbacks.put(id, callback);
        return id;
    }
    
    public static void unregisterCallback(long id) {
        callbacks.remove(id);
    }
    
    public static MobileCallbacks getCallback(long id) {
        return callbacks.get(id);
    }
}
EOF

# Create data classes
cat > "$BUILD_DIR/LocationInfo.java" << 'EOF'
package org.guardianproject.proofmode;

public class LocationInfo {
    public final double latitude;
    public final double longitude;
    public final Double altitude;
    public final Double accuracy;
    public final long timestamp;
    
    public LocationInfo(double latitude, double longitude, Double altitude, Double accuracy, long timestamp) {
        this.latitude = latitude;
        this.longitude = longitude;
        this.altitude = altitude;
        this.accuracy = accuracy;
        this.timestamp = timestamp;
    }
}
EOF

cat > "$BUILD_DIR/DeviceInfo.java" << 'EOF'
package org.guardianproject.proofmode;

public class DeviceInfo {
    public final String manufacturer;
    public final String model;
    public final String osVersion;
    public final String deviceId;
    public final String imei;
    
    public DeviceInfo(String manufacturer, String model, String osVersion, String deviceId, String imei) {
        this.manufacturer = manufacturer;
        this.model = model;
        this.osVersion = osVersion;
        this.deviceId = deviceId;
        this.imei = imei;
    }
}
EOF

cat > "$BUILD_DIR/NetworkInfo.java" << 'EOF'
package org.guardianproject.proofmode;

public class NetworkInfo {
    public final String networkType;
    public final String carrier;
    public final String cellTowerId;
    public final String wifiSsid;
    
    public NetworkInfo(String networkType, String carrier, String cellTowerId, String wifiSsid) {
        this.networkType = networkType;
        this.carrier = carrier;
        this.cellTowerId = cellTowerId;
        this.wifiSsid = wifiSsid;
    }
}
EOF

cat > "$BUILD_DIR/MobileCallbacks.java" << 'EOF'
package org.guardianproject.proofmode;

public interface MobileCallbacks {
    LocationInfo getLocation();
    DeviceInfo getDeviceInfo();
    NetworkInfo getNetworkInfo();
    boolean saveData(String hash, String filename, byte[] data);
    boolean saveText(String hash, String filename, String text);
    byte[] signData(byte[] data);
    void reportProgress(String message);
}
EOF

# Create Android Log stub
mkdir -p "$BUILD_DIR/android/util"
cat > "$BUILD_DIR/android/util/Log.java" << 'EOF'
package android.util;
public class Log {
    public static void w(String tag, String msg) {}
}
EOF

# Compile to bytecode if javac is available
if command -v javac &> /dev/null; then
    echo "Compiling Java classes..."
    cd "$BUILD_DIR"
    javac -d "$OUTPUT_DIR" *.java android/util/*.java
    echo "Classes compiled successfully to $OUTPUT_DIR"
else
    echo "javac not found. Cannot compile classes."
    exit 1
fi

echo "Done!"