<!DOCTYPE html>
<!--
Copyright 2016 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.
-->

<link rel="import" href="/tracing/model/event_set.html">
<link rel="import" href="/tracing/value/diagnostics/diagnostic.html">
<link rel="import" href="/tracing/value/diagnostics/event_ref.html">

<script>
'use strict';

tr.exportTo('tr.v.d', function() {
  /**
   * @typedef {!(tr.v.d.EventRef|tr.model.Event)} EventLike
   */

  /**
   * A RelatedEventSet diagnostic contains references to Events
   */
  class RelatedEventSet extends tr.v.d.Diagnostic {
    /**
     * @param {!(tr.model.EventSet|Array.<EventLike>|EventLike)=} opt_events
     */
    constructor(opt_events) {
      super();
      this.eventsByStableId_ = new Map();
      if (opt_events) {
        if (opt_events instanceof tr.model.EventSet ||
            opt_events instanceof Array) {
          for (var event of opt_events)
            this.add(event);
        } else {
          this.add(opt_events);
        }
      }
    }

    /**
     * @param {!(tr.v.d.EventRef|tr.model.Event)} event
     */
    add(event) {
      this.eventsByStableId_.set(event.stableId, event);
    }

    /**
     * @param {!(tr.v.d.EventRef|tr.model.Event)} event
     * @return {boolean}
     */
    has(event) {
      return this.eventsByStableId_.has(event.stableId);
    }

    get length() {
      return this.eventsByStableId_.size;
    }

    *[Symbol.iterator]() {
      for (var [stableId, event] of this.eventsByStableId_)
        yield event;
    }

    /**
     * Resolve all EventRefs into Events by finding their stableIds in |model|.
     * If a stableId cannot be found and |opt_required| is true, then throw an
     * Error.
     * If a stableId cannot be found and |opt_required| is false, then the
     * EventRef will remain an EventRef.
     *
     * @param {!tr.model.Model} model
     * @param {boolean=} opt_required
     */
    resolve(model, opt_required) {
      for (var [stableId, event] of this.eventsByStableId_) {
        if (!(event instanceof tr.v.d.EventRef))
          continue;

        event = model.getEventByStableId(stableId);
        if (event instanceof tr.model.Event)
          this.eventsByStableId_.set(stableId, event);
        else if (opt_required)
          throw new Error('Unable to find Event ' + stableId);
      }
    }

    asDictInto_(d) {
      d.events = [];
      for (var event of this) {
        d.events.push({
          stableId: event.stableId,
          title: event.title,
          start: event.start,
          duration: event.duration
        });
      }
    }

    static fromDict(d) {
      return new RelatedEventSet(d.events.map(
          event => new tr.v.d.EventRef(event)));
    }
  }

  tr.v.d.Diagnostic.register(RelatedEventSet, {
    elementName: 'tr-v-ui-related-event-set-span'
  });

  return {
    RelatedEventSet: RelatedEventSet
  };
});
</script>
