// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import '../shell/shell.js';
import '../../panels/mobile_throttling/mobile_throttling-meta.js';
import '../../panels/js_timeline/js_timeline-meta.js';
import '../../panels/network/network-meta.js';

import * as Common from '../../core/common/common.js';
import * as i18n from '../../core/i18n/i18n.js';
import * as Root from '../../core/root/root.js';
import type * as Resources from '../../panels/application/application.js';
import type * as Sources from '../../panels/sources/sources.js';
import * as UI from '../../ui/legacy/legacy.js';
import * as Main from '../main/main.js';

import * as App from './app/app.js';

const {NodeConnectionsPanel} = App.NodeConnectionsPanel;
const {NodeMainImpl} = App.NodeMain;

const UIStrings = {
  /**
   * @description Text that refers to the network connection
   */
  connection: 'Connection',
  /**
   * @description A tag of Node.js Connection Panel that can be searched in the command menu
   */
  node: 'node',
  /**
   * @description Command for showing the Connection tool
   */
  showConnection: 'Show Connection',
  /**
   * @description Title of the 'Node' tool in the Network Navigator View, which is part of the Sources tool
   */
  networkTitle: 'Node',
  /**
   * @description Command for showing the 'Node' tool in the Network Navigator View, which is part of the Sources tool
   */
  showNode: 'Show Node',
  /**
   * @description Text in Application Panel Sidebar of the Application panel
   */
  application: 'Application',
  /**
   * @description Command for showing the 'Application' tool
   */
  showApplication: 'Show Application',
} as const;

const str_ = i18n.i18n.registerUIStrings('entrypoints/node_app/node_app.ts', UIStrings);
const i18nLazyString = i18n.i18n.getLazilyComputedLocalizedString.bind(undefined, str_);

let loadedSourcesModule: (typeof Sources|undefined);

async function loadSourcesModule(): Promise<typeof Sources> {
  if (!loadedSourcesModule) {
    loadedSourcesModule = await import('../../panels/sources/sources.js');
  }
  return loadedSourcesModule;
}

UI.ViewManager.registerViewExtension({
  location: UI.ViewManager.ViewLocationValues.PANEL,
  id: 'node-connection',
  title: i18nLazyString(UIStrings.connection),
  commandPrompt: i18nLazyString(UIStrings.showConnection),
  order: 0,
  async loadView() {
    return new NodeConnectionsPanel();
  },
  tags: [i18nLazyString(UIStrings.node)],
});

UI.ViewManager.registerViewExtension({
  location: UI.ViewManager.ViewLocationValues.NAVIGATOR_VIEW,
  id: 'navigator-network',
  title: i18nLazyString(UIStrings.networkTitle),
  commandPrompt: i18nLazyString(UIStrings.showNode),
  order: 2,
  persistence: UI.ViewManager.ViewPersistence.PERMANENT,
  async loadView() {
    const Sources = await loadSourcesModule();
    return Sources.SourcesNavigator.NetworkNavigatorView.instance();
  },
});

let loadedResourcesModule: (typeof Resources|undefined);

async function loadResourcesModule(): Promise<typeof Resources> {
  if (!loadedResourcesModule) {
    loadedResourcesModule = await import('../../panels/application/application.js');
  }
  return loadedResourcesModule;
}

UI.ViewManager.registerViewExtension({
  location: UI.ViewManager.ViewLocationValues.PANEL,
  id: 'resources',
  title: i18nLazyString(UIStrings.application),
  commandPrompt: i18nLazyString(UIStrings.showApplication),
  order: 70,
  async loadView() {
    const Resources = await loadResourcesModule();
    return Resources.ResourcesPanel.ResourcesPanel.instance({
      forceNew: true,
      mode: 'node',
    });
  },
  tags: [],
});

// @ts-expect-error Exposed for legacy layout tests
self.runtime = Root.Runtime.Runtime.instance({forceNew: true});
Common.Runnable.registerEarlyInitializationRunnable(NodeMainImpl.instance);
new Main.MainImpl.MainImpl();
