package com.objectdetection;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import androidx.annotation.NonNull;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.WritableArray;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.bridge.Arguments;
import com.google.mlkit.vision.common.InputImage;
import com.google.mlkit.vision.objects.ObjectDetection;
import com.google.mlkit.vision.objects.ObjectDetector;
import com.google.mlkit.vision.objects.defaults.ObjectDetectorOptions;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

public class ObjectDetectionModule extends ReactContextBaseJavaModule {
    private final ReactApplicationContext reactContext;
    private final ObjectDetector objectDetector;

    public ObjectDetectionModule(ReactApplicationContext reactContext) {
        super(reactContext);
        this.reactContext = reactContext;
        ObjectDetectorOptions options = new ObjectDetectorOptions.Builder()
                .setDetectorMode(ObjectDetectorOptions.STREAM_MODE)
                .enableMultipleObjects()
                .enableClassification()
                .build();
        this.objectDetector = ObjectDetection.getClient(options);
    }

    @NonNull
    @Override
    public String getName() {
        return "ObjectDetectionModule";
    }

    @ReactMethod
    public void startObjectDetection(String imagePath, Promise promise) {
        try {
            Bitmap bitmap = loadImageFromPath(imagePath);
            InputImage image = InputImage.fromBitmap(bitmap, 0);

            objectDetector.process(image)
                    .addOnSuccessListener(detectedObjects -> {
                        WritableArray result = Arguments.createArray();
                        for (com.google.mlkit.vision.objects.DetectedObject object : detectedObjects) {
                            WritableMap objectMap = Arguments.createMap();
                            
                            // Add bounding box
                            WritableMap frame = Arguments.createMap();
                            frame.putDouble("left", object.getBoundingBox().left);
                            frame.putDouble("top", object.getBoundingBox().top);
                            frame.putDouble("right", object.getBoundingBox().right);
                            frame.putDouble("bottom", object.getBoundingBox().bottom);
                            objectMap.putMap("frame", frame);

                            // Add tracking ID
                            objectMap.putNull("trackingID");

                            // Add labels
                            WritableArray labels = Arguments.createArray();
                            for (com.google.mlkit.vision.objects.DetectedObject.Label label : object.getLabels()) {
                                WritableMap labelMap = Arguments.createMap();
                                labelMap.putString("text", label.getText());
                                labelMap.putDouble("confidence", label.getConfidence());
                                labels.pushMap(labelMap);
                            }
                            objectMap.putArray("labels", labels);

                            result.pushMap(objectMap);
                        }
                        promise.resolve(result);
                    })
                    .addOnFailureListener(e -> promise.reject("ERROR", "Object detection failed", e));
        } catch (Exception e) {
            promise.reject("ERROR", "Failed to process image", e);
        }
    }

    private Bitmap loadImageFromPath(String imagePath) throws IOException {
        if (imagePath.startsWith("http")) {
            URL url = new URL(imagePath);
            return BitmapFactory.decodeStream(url.openConnection().getInputStream());
        } else {
            Uri uri = Uri.parse(imagePath);
            InputStream inputStream = reactContext.getContentResolver().openInputStream(uri);
            return BitmapFactory.decodeStream(inputStream);
        }
    }
} 