import { default as NativeNetInfo } from '@react-native-community/netinfo';
import EventsDispatcher from 'core/events/dispatcher';
import Util from 'core/util';
import Reachability from 'core/reachability';

function hasOnlineConnectionState(connectionState): boolean {
  return connectionState.type.toLowerCase() !== 'none';
}

export class NetInfo extends EventsDispatcher implements Reachability {
  online: boolean;

  constructor() {
    super();
    this.online = true;

    NativeNetInfo.fetch().then(connectionState => {
      this.online = hasOnlineConnectionState(connectionState);
    });

    NativeNetInfo.addEventListener(connectionState => {
      var isNowOnline = hasOnlineConnectionState(connectionState);

      // React Native counts the switch from Wi-Fi to Cellular
      // as a state change. Return if current and previous states
      // are both online/offline
      if (this.online === isNowOnline) return;
      this.online = isNowOnline;
      if (this.online) {
        this.emit('online');
      } else {
        this.emit('offline');
      }
    });
  }

  isOnline(): boolean {
    return this.online;
  }
}

export var Network = new NetInfo();
