// Copyright 2018 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 {SDK.SDKModelObserver<!SDK.LogModel>}
 */
export default class LogManager {
  constructor() {
    SDK.targetManager.observeModels(SDK.LogModel, this);
  }

  /**
   * @override
   * @param {!SDK.LogModel} logModel
   */
  modelAdded(logModel) {
    const eventListeners = [];
    eventListeners.push(logModel.addEventListener(SDK.LogModel.Events.EntryAdded, this._logEntryAdded, this));
    logModel[_eventSymbol] = eventListeners;
  }

  /**
   * @override
   * @param {!SDK.LogModel} logModel
   */
  modelRemoved(logModel) {
    Common.EventTarget.removeEventListeners(logModel[_eventSymbol]);
  }

  /**
   * @param {!Common.Event} event
   */
  _logEntryAdded(event) {
    const data = /** @type {{logModel: !SDK.LogModel, entry: !Protocol.Log.LogEntry}} */ (event.data);
    const target = data.logModel.target();

    const consoleMessage = new SDK.ConsoleMessage(
        target.model(SDK.RuntimeModel), data.entry.source, data.entry.level, data.entry.text, undefined, data.entry.url,
        data.entry.lineNumber, undefined, [data.entry.text, ...(data.entry.args || [])], data.entry.stackTrace,
        data.entry.timestamp, undefined, undefined, data.entry.workerId);

    if (data.entry.networkRequestId) {
      SDK.networkLog.associateConsoleMessageWithRequest(consoleMessage, data.entry.networkRequestId);
    }

    if (consoleMessage.source === SDK.ConsoleMessage.MessageSource.Worker) {
      const workerId = consoleMessage.workerId || '';
      // We have a copy of worker messages reported through the page, so that
      // user can see messages from the worker which has been already destroyed.
      // When opening DevTools, give us some time to connect to the worker and
      // not report the message twice if the worker is still alive.
      if (SDK.targetManager.targetById(workerId)) {
        return;
      }
      setTimeout(() => {
        if (!SDK.targetManager.targetById(workerId)) {
          SDK.consoleModel.addMessage(consoleMessage);
        }
      }, 1000);
    } else {
      SDK.consoleModel.addMessage(consoleMessage);
    }
  }
}

const _eventSymbol = Symbol('_events');

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

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

/** @constructor */
BrowserSDK.LogManager = LogManager;

// TODO(crbug.com/1006759): Move out of this module
new LogManager();
