// Copyright 2021 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import * as Common from '../../core/common/common.js';
import type * as Platform from '../../core/platform/platform.js';
import * as Root from '../../core/root/root.js';
import {
  deinitializeGlobalVars,
  initializeGlobalVars,
} from '../../testing/EnvironmentHelpers.js';

import * as LegacyUI from './legacy.js';

async function registerDockingSettings(currentValue: string) {
  Common.Settings.registerSettingsForTest([{
    category: Common.Settings.SettingCategory.GLOBAL,
    settingName: 'currentDockState',
    settingType: Common.Settings.SettingType.ENUM,
    defaultValue: currentValue,
    options: [
      {
        value: 'right',
        text: () => 'right' as Platform.UIString.LocalizedString,
        title: () => 'Dock to right' as Platform.UIString.LocalizedString,
        raw: false,
      },
      {
        value: 'bottom',
        text: () => 'bottom' as Platform.UIString.LocalizedString,
        title: () => 'Dock to bottom' as Platform.UIString.LocalizedString,
        raw: false,
      },
      {
        value: 'left',
        text: () => 'left' as Platform.UIString.LocalizedString,
        title: () => 'Dock to left' as Platform.UIString.LocalizedString,
        raw: false,
      },
      {
        value: 'undocked',
        text: () => 'undocked' as Platform.UIString.LocalizedString,
        title: () => 'Undock' as Platform.UIString.LocalizedString,
        raw: false,
      },
    ],
  }]);
  Root.Runtime.experiments.clearForTest();
  await initializeGlobalVars({reset: false});
}

describe('DockController', () => {
  after(async () => {
    await deinitializeGlobalVars();
  });
  it('defaults the dockside to undefined when first created', async () => {
    /* Note: this seems like weird behaviour, but updating DockController to
     * explicitly set DockSide by default seems to cause issues in Chrome web
     * tests, so adding this test here to ensure we don't cause any problems.
     */
    await registerDockingSettings('left');
    const dockController = LegacyUI.DockController.DockController.instance({forceNew: true, canDock: true});
    assert.isUndefined(dockController.dockSide());
  });

  it('falls back to undefined if the setting value is unexpected', async () => {
    await registerDockingSettings('woah-not-a-real-setting-value');
    const dockController = LegacyUI.DockController.DockController.instance({forceNew: true, canDock: true});
    assert.isUndefined(dockController.dockSide());
  });

  it('sets the dockSide to undocked if the dock cannot be docked', async () => {
    await registerDockingSettings('left');
    const dockController = LegacyUI.DockController.DockController.instance({forceNew: true, canDock: false});
    assert.strictEqual(dockController.dockSide(), LegacyUI.DockController.DockState.UNDOCKED);
  });

  it('can toggle the dock between two settings', async () => {
    await registerDockingSettings('left');
    const dockController = LegacyUI.DockController.DockController.instance({forceNew: true, canDock: true});
    dockController.toggleDockSide();
    assert.strictEqual(dockController.dockSide(), LegacyUI.DockController.DockState.BOTTOM);
    dockController.toggleDockSide();
    assert.strictEqual(dockController.dockSide(), LegacyUI.DockController.DockState.LEFT);
    dockController.toggleDockSide();
    assert.strictEqual(dockController.dockSide(), LegacyUI.DockController.DockState.BOTTOM);
  });
});
