/**
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 *
 * @flow strict-local
 * @format
 */

'use strict';

import Platform from '../Utilities/Platform';

declare var console: typeof console & {_isPolyfilled: boolean, ...};

/**
 * Sets up developer tools for React Native.
 * You can use this module directly, or just require InitializeCore.
 */
if (__DEV__) {
  // TODO (T45803484) Enable devtools for bridgeless RN
  if (!global.RN$Bridgeless) {
    if (!global.__RCTProfileIsProfiling) {
      require('./setUpReactDevTools');

      // Set up inspector
      const JSInspector = require('../JSInspector/JSInspector');
      JSInspector.registerAgent(require('../JSInspector/NetworkAgent'));
    }

    // Note we can't check if console is "native" because it would appear "native" in JSC and Hermes.
    // We also can't check any properties that don't exist in the Chrome worker environment.
    // So we check a navigator property that's set to a particular value ("Netscape") in all real browsers.
    const isLikelyARealBrowser =
      global.navigator != null &&
      /*              _
       *             | |
       *   _ __   ___| |_ ___  ___ __ _ _ __   ___
       *  | '_ \ / _ \ __/ __|/ __/ _` | '_ \ / _ \
       *  | | | |  __/ |_\__ \ (_| (_| | |_) |  __/
       *  |_| |_|\___|\__|___/\___\__,_| .__/ \___|
       *                               | |
       *                               |_|
       */
      global.navigator.appName === 'Netscape'; // Any real browser

    if (!Platform.isTesting) {
      const HMRClient = require('../Utilities/HMRClient');

      if (console._isPolyfilled) {
        // We assume full control over the console and send JavaScript logs to Metro.
        [
          'trace',
          'info',
          'warn',
          'error',
          'log',
          'group',
          'groupCollapsed',
          'groupEnd',
          'debug',
        ].forEach(level => {
          const originalFunction = console[level];
          console[level] = function(...args) {
            HMRClient.log(level, args);
            originalFunction.apply(console, args);
          };
        });
      } else {
        // We assume the environment has a real rich console (like Chrome), and don't hijack it to log to Metro.
        // It's likely the developer is using rich console to debug anyway, and hijacking it would
        // lose the filenames in console.log calls: https://github.com/facebook/react-native/issues/26788.
        HMRClient.log('log', [
          `JavaScript logs will appear in your ${
            isLikelyARealBrowser ? 'browser' : 'environment'
          } console`,
        ]);
      }
    }

    require('./setUpReactRefresh');
  }
}
