// Copyright (C) 2023 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

import './ui_main.scss';
import m from 'mithril';
import {AppImpl} from '../core/app_impl';
import {CookieConsent} from '../core/cookie_consent';
import {featureFlags} from '../core/feature_flags';
import {LinearProgress} from '../widgets/linear_progress';
import {maybeRenderFullscreenModalDialog} from '../widgets/modal';
import {initCssConstants} from './css_constants';
import {Sidebar} from './views/sidebar';
import {SidePanelContainer} from './side_panel';
import {renderStatusBar} from './statusbar';
import {taskTracker} from './task_tracker';
import {Topbar} from './topbar';

const showStatusBarFlag = featureFlags.register({
  id: 'Enable status bar',
  description: 'Enable status bar at the bottom of the window',
  defaultValue: true,
});
// Read the page title set by index.html. This can be overridden at build time
// via --title (e.g. to distinguish multiple dev server instances).
const APP_TITLE = document.title || 'Perfetto UI';

// This components gets destroyed and recreated every time the current trace
// changes. Note that in the beginning the current trace is undefined.
export class UiMain implements m.ClassComponent {
  // This function is invoked once per trace.
  constructor() {
    const app = AppImpl.instance;
    const trace = app.trace;

    // Update the title bar to reflect the loaded trace's title
    if (trace) {
      document.title = `${trace.traceInfo.traceTitle || 'Trace'} - ${APP_TITLE}`;
    } else {
      document.title = APP_TITLE;
    }
  }

  view(): m.Children {
    // Update the trace reference on each render so that it's kept up to date.
    const app = AppImpl.instance;
    const trace = app.trace;

    const isSomethingLoading =
      app.isLoadingTrace ||
      (trace?.engine.numRequestsPending ?? 0) > 0 ||
      taskTracker.hasPendingTasks();

    return m('main.pf-ui-main', [
      m(Sidebar, {app}),
      m(Topbar, {trace}),
      m(LinearProgress, {
        className: 'pf-ui-main__loading',
        state: isSomethingLoading ? 'indeterminate' : 'none',
      }),
      m(
        '.pf-ui-main__page-container',
        m(SidePanelContainer, {
          sidePanelMgr: app.sidePanel,
          pageContent: app.pages.renderPageForCurrentRoute(),
        }),
      ),
      m(CookieConsent),
      maybeRenderFullscreenModalDialog(),
      showStatusBarFlag.get() && renderStatusBar(app),
      app.perfDebugging.renderPerfStats(),
    ]);
  }

  oncreate({dom}: m.VnodeDOM) {
    initCssConstants(dom);
  }
}
