// This fixes a problem with a deprectecated `cancelTouches` property.
// Should be able to remove this at some point.
import 'react-native-gesture-handler';

import './sentry';
import { AppRegistry } from 'react-native';
import AppRoot from './client';
import VersionNumber from 'react-native-version-number';
import * as clientFetch from 'loot-core/src/platform/client/fetch';
import nodejs from 'nodejs-mobile-react-native';
import RNFetchBlob from 'rn-fetch-blob';

console.disableYellowBox = true;

let serverProxy = {
  onmessage: null,
  postMessage: msg => {
    nodejs.channel.send(msg);
  }
};

clientFetch.init(serverProxy);

nodejs.start('main.js');
nodejs.channel.addListener(
  'message',
  msg => {
    msg = JSON.parse(msg);

    if (msg.type === 'internal') {
      switch (msg.subtype) {
        case 'captureEvent':
          let event = msg.event;
          global.SentryClient.captureEvent(event);
          break;
        case 'captureBreadcrumb':
          global.SentryClient.addBreadcrumb(msg.breadcrumb);
          break;
        default:
      }

      return;
    } else {
      serverProxy.onmessage(msg);
    }
  },
  this
);

nodejs.channel.send(
  JSON.stringify({
    type: 'init',
    dataDir: RNFetchBlob.fs.dirs.DocumentDir,
    documentDir: RNFetchBlob.fs.dirs.DocumentDir,
    // eslint-disable-next-line
    dev: __DEV__,
    version: VersionNumber.appVersion
  })
);

// See promise error stack traces by re-throwing as normal errors
const tracking = require('promise/setimmediate/rejection-tracking'); // eslint-disable-line import/no-extraneous-dependencies

tracking.enable({
  allRejections: true,
  onUnhandled: (id, err) => {
    throw err;
  },
  onHandled: () => {}
});

const defaultErrorHandler = global.ErrorUtils.getGlobalHandler();
const myErrorHandler = (e, isFatal) => {
  // Suppress crashing the app
  // TODO: This shouldn't be silent, instead should show a fatal error UI
  //   Should add this handler in App.js and set React state
  defaultErrorHandler(e, false);
};
global.ErrorUtils.setGlobalHandler(myErrorHandler);

AppRegistry.registerComponent('actual', () => AppRoot);