package io.wifi.p2p;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.wifi.p2p.WifiP2pDeviceList;
import android.net.wifi.p2p.WifiP2pGroup;
import android.net.wifi.p2p.WifiP2pInfo;
import android.net.wifi.p2p.WifiP2pManager;
import androidx.annotation.Nullable;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.modules.core.DeviceEventManagerModule;

/** Created by zyusk on 15.07.2018. */
public class WiFiP2PBroadcastReceiver extends BroadcastReceiver {
  private WifiP2pManager manager;
  private WifiP2pManager.Channel channel;
  private ReactApplicationContext reactContext;
  private WiFiP2PDeviceMapper mapper = new WiFiP2PDeviceMapper();

  public WiFiP2PBroadcastReceiver(
      WifiP2pManager manager,
      WifiP2pManager.Channel channel,
      ReactApplicationContext reactContext) {
    super();

    this.manager = manager;
    this.channel = channel;
    this.reactContext = reactContext;
  }

  @Override
  public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();

    if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {
      manager.requestPeers(channel, peerListListener);
    } else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {
      manager.requestConnectionInfo(channel, connectionListener);
    } else if (intent.getAction().equals(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION)) {
      this.manager.requestGroupInfo(channel, groupInfoListener);
    }
  }

  private WifiP2pManager.GroupInfoListener groupInfoListener =
      new WifiP2pManager.GroupInfoListener() {
        @Override
        public void onGroupInfoAvailable(WifiP2pGroup group) {
          if (group != null) {
            WritableMap params = mapper.mapWiFiP2PGroupInfoToReactEntity(group);
            sendEvent("WIFI_P2P:THIS_DEVICE_CHANGED_ACTION", params);
          }
        }
      };

  private WifiP2pManager.PeerListListener peerListListener =
      new WifiP2pManager.PeerListListener() {
        @Override
        public void onPeersAvailable(WifiP2pDeviceList deviceList) {
          WritableMap params = mapper.mapDevicesInfoToReactEntity(deviceList);
          sendEvent("WIFI_P2P:PEERS_UPDATED", params);
        }
      };

  private WifiP2pManager.ConnectionInfoListener connectionListener =
      new WifiP2pManager.ConnectionInfoListener() {
        @Override
        public void onConnectionInfoAvailable(final WifiP2pInfo info) {
          WritableMap params = mapper.mapWiFiP2PInfoToReactEntity(info);
          sendEvent("WIFI_P2P:CONNECTION_INFO_UPDATED", params);
        }
      };

  private void sendEvent(String eventName, @Nullable WritableMap params) {
    reactContext
        .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
        .emit(eventName, params);
  }
}
