/**
 * 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.
 *
 * @format
 */

import {FlipperServer, FlipperServerConfig} from 'flipper-common';
import {getRenderHostInstance} from 'flipper-ui-core';

export function initializeRenderHost(
  flipperServer: FlipperServer,
  flipperServerConfig: FlipperServerConfig,
) {
  window.FlipperRenderHostInstance = {
    processId: 0,
    isProduction: window.flipperConfig.debug !== true,
    readTextFromClipboard() {
      // TODO:
      return undefined;
    },
    writeTextToClipboard(_text: string) {
      // TODO:
    },
    async importFile() {
      throw new Error('Not implemented');
    },
    async exportFile() {
      throw new Error('Not implemented');
    },
    openLink(url: string) {
      window.open(url, '_blank');
    },
    registerShortcut(_shortcut, _callback) {
      // TODO:
      return () => {};
    },
    hasFocus() {
      return document.hasFocus();
    },
    onIpcEvent(event) {
      console.warn('onIpcEvent not available', event);
    },
    sendIpcEvent(event, ..._args: any[]) {
      console.warn('sendIpcEvent not available', event);
    },
    shouldUseDarkColors() {
      return !!(
        window.flipperConfig.theme === 'dark' ||
        (window.flipperConfig.theme === 'system' &&
          window.matchMedia?.('(prefers-color-scheme: dark)'))
      );
    },
    restartFlipper() {
      // TODO: restart server as well
      window.location.reload();
    },
    loadDefaultPlugins: getDefaultPluginsIndex,
    serverConfig: flipperServerConfig,
    GK(gatekeeper) {
      return flipperServerConfig.gatekeepers[gatekeeper] ?? false;
    },
    flipperServer,
    async requirePlugin(path) {
      // TODO: use `await import(path)`?
      const source = await getRenderHostInstance().flipperServer.exec(
        'plugin-source',
        path,
      );
      // eslint-disable-next-line no-eval
      return eval(source);
    },
  };
}

function getDefaultPluginsIndex() {
  // TODO:
  return {};
  // eslint-disable-next-line import/no-unresolved
  // const index = require('../defaultPlugins');
  // return index.default || index;
}
