package me.furtado.smsretriever;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import androidx.annotation.NonNull;

import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.WritableNativeMap;
import com.facebook.react.modules.core.DeviceEventManagerModule;
import com.google.android.gms.auth.api.phone.SmsRetriever;
import com.google.android.gms.common.api.CommonStatusCodes;
import com.google.android.gms.common.api.Status;

public final class SmsBroadcastReceiver extends BroadcastReceiver {

    private static final String SMS_EVENT = "me.furtado.smsretriever:SmsEvent";

    private static final String EXTRAS_KEY = "extras";
    private static final String MESSAGE_KEY = "message";
    private static final String STATUS_KEY = "status";
    private static final String TIMEOUT_KEY = "timeout";

    private static final String EXTRAS_NULL_ERROR_MESSAGE = "Extras is null.";
    private static final String STATUS_NULL_ERROR_MESSAGE = "Status is null.";
    private static final String TIMEOUT_ERROR_MESSAGE = "Timeout error.";

    private ReactApplicationContext mContext;

    public SmsBroadcastReceiver(final ReactApplicationContext context) {
        mContext = context;
    }

    @Override
    public void onReceive(final Context context, final Intent intent) {
        if (SmsRetriever.SMS_RETRIEVED_ACTION.equals(intent.getAction())) {
            final Bundle extras = intent.getExtras();
            if (extras == null) {
                emitJSEvent(EXTRAS_KEY, EXTRAS_NULL_ERROR_MESSAGE);
                return;
            }

            final Status status = (Status) extras.get(SmsRetriever.EXTRA_STATUS);
            if (status == null) {
                emitJSEvent(STATUS_KEY, STATUS_NULL_ERROR_MESSAGE);
                return;
            }

            switch (status.getStatusCode()) {
                case CommonStatusCodes.SUCCESS: {
                    final String message = (String) extras.get(SmsRetriever.EXTRA_SMS_MESSAGE);
                    emitJSEvent(MESSAGE_KEY, message);
                    break;
                }

                case CommonStatusCodes.TIMEOUT: {
                    emitJSEvent(TIMEOUT_KEY, TIMEOUT_ERROR_MESSAGE);
                    break;
                }
            }
        }
    }

    //region - Privates

    private void emitJSEvent(@NonNull final String key, final String message) {
        if (mContext == null) {
            return;
        }

        if (!mContext.hasActiveCatalystInstance()) {
            return;
        }

        WritableNativeMap map = new WritableNativeMap();
        map.putString(key, message);

        mContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit(SMS_EVENT, map);
    }

    //endregion

}