// 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 m from 'mithril';

import {pluginManager, pluginRegistry} from '../common/plugins';
import {raf} from '../core/raf_scheduler';
import {Button} from '../widgets/button';

import {exists} from '../base/utils';
import {PluginDescriptor} from '../public';
import {createPage} from './pages';
import {defaultPlugins} from '../core/default_plugins';
import {Intent} from '../widgets/common';

export const PluginsPage = createPage({
  view() {
    return m(
      '.pf-plugins-page',
      m('h1', 'Plugins'),
      m(
        '.pf-plugins-topbar',
        m(Button, {
          intent: Intent.Primary,
          label: 'Disable All',
          onclick: async () => {
            for (const plugin of pluginRegistry.values()) {
              await pluginManager.disablePlugin(plugin.pluginId, true);
              raf.scheduleFullRedraw();
            }
          },
        }),
        m(Button, {
          intent: Intent.Primary,
          label: 'Enable All',
          onclick: async () => {
            for (const plugin of pluginRegistry.values()) {
              await pluginManager.enablePlugin(plugin.pluginId, true);
              raf.scheduleFullRedraw();
            }
          },
        }),
        m(Button, {
          intent: Intent.Primary,
          label: 'Restore Defaults',
          onclick: async () => {
            await pluginManager.restoreDefaults(true);
            raf.scheduleFullRedraw();
          },
        }),
      ),
      m(
        '.pf-plugins-grid',
        [
          m('span', 'Plugin'),
          m('span', 'Default?'),
          m('span', 'Enabled?'),
          m('span', 'Active?'),
          m('span', 'Control'),
          m('span', 'Load Time'),
        ],
        Array.from(pluginRegistry.values()).map((plugin) => {
          return renderPluginRow(plugin);
        }),
      ),
    );
  },
});

function renderPluginRow(plugin: PluginDescriptor): m.Children {
  const pluginId = plugin.pluginId;
  const isDefault = defaultPlugins.includes(pluginId);
  const pluginDetails = pluginManager.plugins.get(pluginId);
  const isActive = pluginManager.isActive(pluginId);
  const isEnabled = pluginManager.isEnabled(pluginId);
  const loadTime = pluginDetails?.previousOnTraceLoadTimeMillis;
  return [
    m('span', pluginId),
    m('span', isDefault ? 'Yes' : 'No'),
    isEnabled
      ? m('.pf-tag.pf-active', 'Enabled')
      : m('.pf-tag.pf-inactive', 'Disabled'),
    isActive
      ? m('.pf-tag.pf-active', 'Active')
      : m('.pf-tag.pf-inactive', 'Inactive'),
    m(Button, {
      label: isActive ? 'Disable' : 'Enable',
      intent: Intent.Primary,
      onclick: async () => {
        if (isActive) {
          await pluginManager.disablePlugin(pluginId, true);
        } else {
          await pluginManager.enablePlugin(pluginId, true);
        }
        raf.scheduleFullRedraw();
      },
    }),
    exists(loadTime) ? m('span', `${loadTime.toFixed(1)} ms`) : m('span', `-`),
  ];
}
