package com.rereactnative;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;

import com.facebook.react.bridge.Callback;
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.module.annotations.ReactModule;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.Calendar;

import io.mob.resu.reandroidsdk.AppConstants;
import io.mob.resu.reandroidsdk.AppLifecyclePresenter;
import io.mob.resu.reandroidsdk.IDeepLinkInterface;
import io.mob.resu.reandroidsdk.MRegisterUser;
import io.mob.resu.reandroidsdk.ReAndroidSDK;
import io.mob.resu.reandroidsdk.error.Log;

@ReactModule(name = ReReactNativeModule.NAME)
public class ReReactNativeModule extends ReactContextBaseJavaModule {
  public static final String NAME = "rereactnative";
//  ReactApplicationContext reactContext;
  Context context;

  public ReReactNativeModule(Context reactContext) {
    this.context = reactContext;
    ReAndroidSDK.getInstance(context);
    AppConstants.LogFlag = true;
  }

  private String OldScreenName = null;
  private String newScreenName = null;
  private Calendar oldCalendar = Calendar.getInstance();
  private Calendar sCalendar = Calendar.getInstance();

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

  @ReactMethod
  public void locationUpdate(double lat, double lang) {
    ReAndroidSDK.getInstance(context).onLocationUpdate(lat, lang);
  }

  @ReactMethod
  public void appConversionTracking() {
    ReAndroidSDK.getInstance(context).appConversionTracking();
  }

  @ReactMethod
  public void appConversionTrackingWithData(String data) throws JSONException {
    JSONObject json1 = new JSONObject(data);
    ReAndroidSDK.getInstance(context).appConversionTracking(json1);
  }

  @ReactMethod
  public void addNewNotification(String title, String body) {
    ReAndroidSDK.getInstance(context).addNewNotification(title, body, "MainActivity");
  }

  @ReactMethod
  public void deleteNotificationById(String id) {
    ReAndroidSDK.getInstance(context).deleteNotificationByNotificationId(id);
  }

  @ReactMethod
  public void deleteNotificationByObject(String json) throws JSONException {
    JSONObject json1 = new JSONObject(json);
    ReAndroidSDK.getInstance(context).deleteNotificationByObject(json1);
  }

  @ReactMethod
  public void getReadNotificationCount(Promise promise) {
    int count = ReAndroidSDK.getInstance(context).getReadNotificationCount();
    promise.resolve(count);
  }


  @ReactMethod
  public void updatePushToken(String token) {
    ReAndroidSDK.getInstance(context).updatePushToken(token);
  }

  @ReactMethod
  public void onTrackEvent(String eventName) {
    ReAndroidSDK.getInstance(context).onTrackEvent(eventName);
  }

  @ReactMethod
  public void onTrackEventWithData(String data, String eventName) throws JSONException {
    JSONObject jsonData = new JSONObject(data);
    ReAndroidSDK.getInstance(context).onTrackEvent(jsonData, eventName);
  }

  @ReactMethod
  public void onDeviceUserRegister(String json) throws JSONException {
    JSONObject json1 = new JSONObject(json);
    MRegisterUser obj = new MRegisterUser();
    obj.setAdId(json1.getString("uid"));
    obj.setUserUniqueId(json1.getString("useruid"));
    obj.setName(json1.getString("name"));
    obj.setAge(json1.getString("age"));
    obj.setEmail(json1.getString("email"));
    obj.setPhone(json1.getString("phone"));
    obj.setGender(json1.getString("gender"));
    obj.setDeviceToken(json1.getString("token"));
    obj.setProfileUrl(json1.getString("profileURL"));
    obj.setDob(json1.getString("dob"));
    obj.setEducation(json1.getString("education"));
    obj.setEmployed(json1.getBoolean("employed"));
    obj.setMarried(json1.getBoolean("married"));
    ReAndroidSDK.getInstance(context).onDeviceUserRegister(obj);
  }

  @ReactMethod
  public void formDataCapture(String json) throws JSONException {
    JSONObject json1 = new JSONObject(json);
    ReAndroidSDK.getInstance(context).formDataCapture(json1);
  }

  @ReactMethod
  public void readNotification(String campaignId) {
    ReAndroidSDK.getInstance(context).readNotification(campaignId);
  }

  @ReactMethod
  public void unReadNotification(String campaignId) {
    ReAndroidSDK.getInstance(context).unReadNotification(campaignId);
  }

  @ReactMethod
  public void getUnreadNotificationCount(Promise promise) {
    int count = ReAndroidSDK.getInstance(context).getUnReadNotificationCount();
    promise.resolve(count);
  }

  @ReactMethod
  public void getNotifications(Promise promise) {
    ArrayList<JSONObject> arrayList = new ArrayList<>();
    arrayList = ReAndroidSDK.getInstance(context).getNotificationByObject();
    JSONArray jsonArray = new JSONArray(arrayList);
    promise.resolve(jsonArray.toString());
  }

  @ReactMethod
  public void getDeepLink(Callback successCallback) {
    ReAndroidSDK.getInstance(context).getCampaignData(new IDeepLinkInterface() {

      public void onInstallDataReceived(String data) {
        successCallback.invoke(new Object[]{null, data});
        Log.e("onInstallDataReceived DATA RECEIVED: ", data);
      }

      public void onDeepLinkData(String data) {
        successCallback.invoke(new Object[]{null, data});
        System.out.println("onDeepLinkData: " + data);
        Log.e("onDeepLinkData DATA RECEIVED: ", data);
      }

    });
  }

  @ReactMethod
  public void getDeepLinkData(Callback callback){
    String data = ReAndroidSDK.getInstance(context).getDeepLinkData();
    Log.e("getDeepLinkData: ", data);
    callback.invoke(data);
  }

  @ReactMethod
  public void screenNavigation(String screenName) {
    try {
      AppConstants.CURRENT_FRAGMENT_NAME = screenName;
      this.screenTracking(screenName);
    } catch (Exception var3) {
      Log.e("userOnPause: ", String.valueOf(var3.getMessage()));
    }
  }

  @ReactMethod
  public void screenTracking(String screenName) {
    AppConstants.CURRENT_FRAGMENT_NAME = screenName;
    try {
      if (this.sCalendar == null) {
        this.sCalendar = Calendar.getInstance();
      }

      this.oldCalendar = this.sCalendar;
      this.sCalendar = Calendar.getInstance();
      if (this.OldScreenName != null) {
        AppLifecyclePresenter.getInstance().onSessionStop(context, this.oldCalendar, this.sCalendar, this.OldScreenName, (String)null, (String)null);
        AppLifecyclePresenter.getInstance().onSessionStartFragment((Activity) context, this.OldScreenName, (Fragment)null);
      }

      if (this.newScreenName == null) {
        this.newScreenName = screenName;
      }
      OldScreenName = newScreenName;
      newScreenName = screenName;
    } catch (Exception var3) {
    }

  }

  @ReactMethod
  public void multiply(int a, int b, Promise promise){
    promise.resolve(a*b);
  }


}
