// Copyright 2014 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.
/**
 * @implements {Common.App}
 * @implements {SDK.SDKModelObserver<!SDK.ScreenCaptureModel>}
 * @unrestricted
 */
export default class ScreencastApp {
  constructor() {
    this._enabledSetting = Common.settings.createSetting('screencastEnabled', true);
    this._toggleButton = new UI.ToolbarToggle(Common.UIString('Toggle screencast'), 'largeicon-phone');
    this._toggleButton.setToggled(this._enabledSetting.get());
    this._toggleButton.setEnabled(false);
    this._toggleButton.addEventListener(UI.ToolbarButton.Events.Click, this._toggleButtonClicked, this);
    SDK.targetManager.observeModels(SDK.ScreenCaptureModel, this);
  }

  /**
   * @return {!Screencast.ScreencastApp}
   */
  static _instance() {
    if (!Screencast.ScreencastApp._appInstance) {
      Screencast.ScreencastApp._appInstance = new Screencast.ScreencastApp();
    }
    return Screencast.ScreencastApp._appInstance;
  }

  /**
   * @override
   * @param {!Document} document
   */
  presentUI(document) {
    const rootView = new UI.RootView();

    this._rootSplitWidget = new UI.SplitWidget(false, true, 'InspectorView.screencastSplitViewState', 300, 300);
    this._rootSplitWidget.setVertical(true);
    this._rootSplitWidget.setSecondIsSidebar(true);
    this._rootSplitWidget.show(rootView.element);
    this._rootSplitWidget.hideMain();

    this._rootSplitWidget.setSidebarWidget(UI.inspectorView);
    UI.inspectorView.setOwnerSplit(this._rootSplitWidget);
    rootView.attachToDocument(document);
    rootView.focus();
  }

  /**
   * @override
   * @param {!SDK.ScreenCaptureModel} screenCaptureModel
   */
  modelAdded(screenCaptureModel) {
    if (this._screenCaptureModel) {
      return;
    }
    this._screenCaptureModel = screenCaptureModel;
    this._toggleButton.setEnabled(true);
    this._screencastView = new Screencast.ScreencastView(screenCaptureModel);
    this._rootSplitWidget.setMainWidget(this._screencastView);
    this._screencastView.initialize();
    this._onScreencastEnabledChanged();
  }

  /**
   * @override
   * @param {!SDK.ScreenCaptureModel} screenCaptureModel
   */
  modelRemoved(screenCaptureModel) {
    if (this._screenCaptureModel !== screenCaptureModel) {
      return;
    }
    delete this._screenCaptureModel;
    this._toggleButton.setEnabled(false);
    this._screencastView.detach();
    delete this._screencastView;
    this._onScreencastEnabledChanged();
  }

  _toggleButtonClicked() {
    const enabled = !this._toggleButton.toggled();
    this._enabledSetting.set(enabled);
    this._onScreencastEnabledChanged();
  }

  _onScreencastEnabledChanged() {
    if (!this._rootSplitWidget) {
      return;
    }
    const enabled = this._enabledSetting.get() && this._screencastView;
    this._toggleButton.setToggled(enabled);
    if (enabled) {
      this._rootSplitWidget.showBoth();
    } else {
      this._rootSplitWidget.hideMain();
    }
  }
}

/**
 * @implements {UI.ToolbarItem.Provider}
 * @unrestricted
 */
export class ToolbarButtonProvider {
  /**
   * @override
   * @return {?UI.ToolbarItem}
   */
  item() {
    return Screencast.ScreencastApp._instance()._toggleButton;
  }
}

/**
 * @implements {Common.AppProvider}
 * @unrestricted
 */
export class ScreencastAppProvider {
  /**
   * @override
   * @return {!Common.App}
   */
  createApp() {
    return Screencast.ScreencastApp._instance();
  }
}

/* Legacy exported object */
self.Screencast = self.Screencast || {};

/* Legacy exported object */
Screencast = Screencast || {};

/**
 * @constructor
 */
Screencast.ScreencastApp = ScreencastApp;

/**
 * @constructor
 */
Screencast.ScreencastApp.ToolbarButtonProvider = ToolbarButtonProvider;

/** @type {!Screencast.ScreencastApp} */
Screencast.ScreencastApp._appInstance;

/**
 * @constructor
 */
Screencast.ScreencastAppProvider = ScreencastAppProvider;
