package com.homansystem.iposprinter;

import android.util.Log;

import android.content.Context;
import android.os.Bundle;
import android.content.BroadcastReceiver;
import android.content.Intent;
import android.content.IntentFilter;
import java.util.Set;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import androidx.core.content.ContextCompat;
import androidx.core.app.ActivityCompat;
import java.util.HashMap;
import java.util.Collections;
import java.util.Map;
import android.app.Activity;
// import com.facebook.react.bridge.Promise;
import android.content.pm.PackageManager;
import android.app.Activity;
import com.facebook.react.bridge.*;

import com.caysn.autoreplyprint.caprint.CAPrinterDiscover;
import com.caysn.autoreplyprint.caprint.CAPrinterDevice;
import android.bluetooth.BluetoothAdapter;

public class KassenBTDiscovery implements ActivityEventListener {
  private static final int REQUEST_ENABLE_BT = 2;
  private Context mContext = null;
  private static final Map<String, Promise> promiseMap = Collections.synchronizedMap(new HashMap<String, Promise>());
  private static final String PROMISE_ENABLE_BT = "ENABLE_BT";
  private Activity mActivity;
  private BluetoothAdapter mBtAdapter;
  private CAPrinterDiscover printerDiscover;

  public KassenBTDiscovery(final Context context, Activity activity) {
    mContext = context;
    mActivity = activity;
    mBtAdapter = BluetoothAdapter.getDefaultAdapter();
    printerDiscover = new CAPrinterDiscover();
    ReactApplicationContext reactContext = (ReactApplicationContext) context;
  }

  @Override
  public void onNewIntent(Intent intent) {

  }

  public void startDiscovery() {
    if (printerDiscover.isDiscovering())
      return;

    printerDiscover.setOnPrinterDiscoveredListener(new CAPrinterDiscover.OnPrinterDiscoveredListener() {
      @Override
      public void onPrinterDiscovered(final CAPrinterDevice printerDevice) {
        String printerDeviceUidString = CAPrinterDevice.toUidString(printerDevice);
        Intent sendIntent = new Intent("BTKassenDeviceFound");
        sendIntent.putExtra("PrinterName", printerDevice.printer_name);
        sendIntent.putExtra("PrinterAddress", printerDevice.port_address);
        sendIntent.putExtra("PrinterType", printerDevice.port_type);
        sendIntent.putExtra("PrinterUid", printerDeviceUidString);
        LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(mContext);
        localBroadcastManager.sendBroadcast(sendIntent);
      }
    });
    printerDiscover.startDiscover();
  }

  public void stopDiscovery() {
    printerDiscover.stopDiscover();
  }

  public void isBluetoothEnabled(Promise promise) {
    promise.resolve(mBtAdapter != null && mBtAdapter.isEnabled());
  }

  public void enableBluetooth(final Promise promise) {
    if (mBtAdapter == null) {
      promise.reject("Adapter Not Initialized");
    } else if (!mBtAdapter.isEnabled()) {
      Intent enableIntent = new Intent(
          BluetoothAdapter.ACTION_REQUEST_ENABLE);
      promiseMap.put(PROMISE_ENABLE_BT, promise);
      mActivity.startActivityForResult(enableIntent, REQUEST_ENABLE_BT, Bundle.EMPTY);
    } else {
      promise.resolve(null);
    }
  }

  @Override
  public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
    BluetoothAdapter adapter = mBtAdapter;
    switch (requestCode) {
      case REQUEST_ENABLE_BT: {
        Promise promise = promiseMap.remove(PROMISE_ENABLE_BT);
        if (resultCode == Activity.RESULT_OK && promise != null) {
          // Bluetooth is now enabled, so set up a session
          if (adapter != null) {
            promise.resolve(null);
          } else {
            promise.resolve(null);
          }

        } else {
          // User did not enable Bluetooth or an error occured
          if (promise != null) {
            promise.reject("ERR", new Exception("BT NOT ENABLED"));
          }
        }
        break;
      }
    }
  }
}