// Copyright 2019 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.

Sources.CoveragePlugin = class extends Sources.UISourceCodeFrame.Plugin {
  /**
   * @param {!SourceFrame.SourcesTextEditor} textEditor
   * @param {!Workspace.UISourceCode} uiSourceCode
   */
  constructor(textEditor, uiSourceCode) {
    super();

    this._textEditor = textEditor;
    this._uiSourceCode = uiSourceCode;

    /* @type {!Workspace.UISourceCode} uiSourceCode */
    this._originalSourceCode = Sources.sourceFormatter.getOriginalUISourceCode(this._uiSourceCode);

    this._text = new UI.ToolbarButton(ls`Click to show Coverage Panel`);
    this._text.setSecondary();
    this._text.addEventListener(UI.ToolbarButton.Events.Click, () => {
      UI.viewManager.showView('coverage');
    });

    const mainTarget = SDK.targetManager.mainTarget();
    if (mainTarget) {
      this._model = mainTarget.model(Coverage.CoverageModel);
      this._model.addEventListener(Coverage.CoverageModel.Events.CoverageReset, this._handleReset, this);

      this._coverage = this._model.getCoverageForUrl(this._originalSourceCode.url());
      if (this._coverage) {
        this._coverage.addEventListener(
            Coverage.URLCoverageInfo.Events.SizesChanged, this._handleCoverageSizesChanged, this);
      }
    }

    this._updateStats();
  }

  /**
   * @override
   */
  dispose() {
    if (this._coverage) {
      this._coverage.removeEventListener(
          Coverage.URLCoverageInfo.Events.SizesChanged, this._handleCoverageSizesChanged, this);
    }
    if (this._model) {
      this._model.removeEventListener(Coverage.CoverageModel.Events.CoverageReset, this._handleReset, this);
    }
  }

  /**
   * @override
   * @param {!Workspace.UISourceCode} uiSourceCode
   * @return {boolean}
   */
  static accepts(uiSourceCode) {
    return uiSourceCode.contentType().isDocumentOrScriptOrStyleSheet();
  }

  _handleReset() {
    this._coverage = null;
    this._updateStats();
  }

  _handleCoverageSizesChanged() {
    this._updateStats();
  }

  _updateStats() {
    if (this._coverage) {
      this._text.setTitle(ls`Show Details`);
      this._text.setText(ls`Coverage: ${this._coverage.usedPercentage().toFixed(1)} %`);
    } else {
      this._text.setTitle(ls`Click to show Coverage Panel`);
      this._text.setText(ls`Coverage: n/a`);
    }
  }

  /**
   * @override
   * @return {!Array<!UI.ToolbarItem>}
   */
  rightToolbarItems() {
    return [this._text];
  }
};
