package com.sentiance.react.bridge.eventtimeline;

import static com.sentiance.react.bridge.eventtimeline.ErrorCodes.E_INVALID_OCCUPANT_ROLE_FEEDBACK;
import static com.sentiance.react.bridge.eventtimeline.ErrorCodes.E_INVALID_VEHICLE_CRASH_FEEDBACK;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableMap;
import com.sentiance.react.bridge.core.common.SentianceSubscriptionsManager;
import com.sentiance.react.bridge.core.common.base.AbstractSentianceModule;
import com.sentiance.react.bridge.eventtimeline.converters.FeedbackConverter;
import com.sentiance.sdk.Sentiance;
import com.sentiance.sdk.feedback.api.FeedbackApi;
import com.sentiance.sdk.feedback.api.OccupantRoleFeedback;
import com.sentiance.sdk.feedback.api.OccupantRoleFeedbackResult;
import com.sentiance.sdk.feedback.api.VehicleCrashDetectionFeedback;
import com.sentiance.sdk.feedback.api.VehicleCrashDetectionFeedbackResult;

public class SentianceFeedbackModule extends AbstractSentianceModule {
    public static final String NATIVE_MODULE_NAME = "SentianceFeedback";

    private final FeedbackApi mFeedbackApi;
    private final FeedbackConverter mFeedbackConverter;

    public SentianceFeedbackModule(ReactApplicationContext reactApplicationContext,
                                   Sentiance sentiance,
                                   FeedbackApi feedbackApi,
                                   SentianceSubscriptionsManager subscriptionsManager,
                                   FeedbackConverter feedbackConverter) {
        super(reactApplicationContext, sentiance, subscriptionsManager);
        this.mFeedbackConverter = feedbackConverter;
        this.mFeedbackApi = feedbackApi;
    }

    @Override
    @ReactMethod
    protected void removeNativeListener(String eventName, int subscriptionId, Promise promise) {
        // Implementation can be added here if needed
    }

    @Override
    @ReactMethod
    protected void addNativeListener(String eventName, int subscriptionId, @Nullable ReadableMap payload, Promise promise) {
        // Implementation can be added here if needed
    }

    @Override
    @ReactMethod
    protected void addListener(String eventName) {
        // Implementation can be added here if needed
    }

    @Override
    @ReactMethod
    protected void removeListeners(Integer count) {
        // Implementation can be added here if needed
    }

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

    @ReactMethod
    public void submitOccupantRoleFeedback(final String transportId,
                                           final String occupantFeedbackRole,
                                           final Promise promise) {
        if (rejectIfNotInitialized(promise)) {
            return;
        }

        OccupantRoleFeedback occupantRoleFeedback = mFeedbackConverter.getOccupantRoleFeedbackFrom(occupantFeedbackRole);
        if (occupantRoleFeedback == null) {
            promise.reject(E_INVALID_OCCUPANT_ROLE_FEEDBACK, new IllegalArgumentException("Invalid occupant role feedback."));
            return;
        }

        OccupantRoleFeedbackResult result = mFeedbackApi.submitOccupantRoleFeedback(transportId, occupantRoleFeedback);
        promise.resolve(result.name());
    }

    @ReactMethod
    public void submitVehicleCrashDetectionFeedback(@Nullable final ReadableMap vehicleCrashFeedbackMap, final Promise promise) {
        if (rejectIfNotInitialized(promise)) {
            return;
        }

        VehicleCrashDetectionFeedback feedback = mFeedbackConverter.convertToVehicleCrashDetectionFeedback(vehicleCrashFeedbackMap);
        if (feedback == null) {
            promise.reject(E_INVALID_VEHICLE_CRASH_FEEDBACK, new IllegalArgumentException("Invalid vehicle crash feedback."));
            return;
        }

        VehicleCrashDetectionFeedbackResult result = mFeedbackApi.submitVehicleCrashDetectionFeedback(feedback);
        promise.resolve(result.name());
    }
}
