<!DOCTYPE html>
<!--
Copyright (c) 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.
-->

<link rel="import" href="/base/guid.html">
<link rel="import" href="/base/extension_registry.html">
<link rel="import" href="/core/trace_model/selectable_item.html">
<link rel="import" href="/core/trace_model/selection_state.html">

<script>
'use strict';

/**
 * @fileoverview Provides the Event class.
 */
tv.exportTo('tv.c.trace_model', function() {
  var SelectableItem = tv.c.trace_model.SelectableItem;
  var SelectionState = tv.c.trace_model.SelectionState;

  // Cached values for getCategoryParts.
  var categoryPartsFor = {};

  /**
   * Categories are stored in comma-separated form, e.g: 'a,b' meaning
   * that the event is part of the a and b category.
   *
   * This function returns the category split by string, caching the
   * array for performance.
   *
   * Do not mutate the returned array!!!!
   */
  function getCategoryParts(category) {
    var parts = categoryPartsFor[category];
    if (parts !== undefined)
      return parts;
    parts = category.split(',');
    categoryPartsFor[category] = parts;
    return parts;
  }

  /**
   * An Event is the base type for any non-container, selectable piece
   * of data in the trace model.
   *
   * @constructor
   * @extends {SelectableItem}
   */
  function Event() {
    SelectableItem.call(this, this /* modelItem */);
    this.guid_ = tv.b.GUID.allocate();
    this.selectionState = SelectionState.NONE;
    this.associatedAlerts = [];
    this.info = undefined;
  }

  Event.prototype = {
    __proto__: SelectableItem.prototype,

    get guid() {
      return this.guid_;
    }
  };

  // Create the type registry.
  function EventRegistry() {
  }
  var options = new tv.b.ExtensionRegistryOptions(tv.b.BASIC_REGISTRY_MODE);
  options.mandatoryBaseType = Event;
  tv.b.decorateExtensionRegistry(EventRegistry, options);

  // Enforce all options objects have the right fields.
  EventRegistry.addEventListener('will-register', function(e) {
    var metadata = e.typeInfo.metadata;

    if (metadata.name === undefined)
      throw new Error('Registered events must provide name metadata');
    var i = tv.b.findFirstInArray(
      EventRegistry.getAllRegisteredTypeInfos(),
      function(x) { return x.metadata.name === metadata.name; });
    if (i !== undefined)
      throw new Error('Event type with that name already registered');

    if (metadata.pluralName === undefined)
      throw new Error('Registered events must provide pluralName metadata');
    if (metadata.singleViewElementName === undefined) {
      throw new Error('Registered events must provide ' +
                      'singleViewElementName metadata');
    }
    if (metadata.multiViewElementName === undefined) {
      throw new Error('Registered events must provide ' +
                      'multiViewElementName metadata');
    }
  });

  // Helper: lookup Events indexed by type name.
  var eventsByTypeName = undefined;
  EventRegistry.getEventTypeInfoByTypeName = function(typeName) {
    if (eventsByTypeName === undefined) {
      eventsByTypeName = {};
      EventRegistry.getAllRegisteredTypeInfos().forEach(function(typeInfo) {
        eventsByTypeName[typeInfo.metadata.name] = typeInfo;
      });
    }
    return eventsByTypeName[typeName];
  }

  // Ensure eventsByTypeName stays current.
  EventRegistry.addEventListener('registry-changed', function() {
    eventsByTypeName = undefined;
  });

  function convertCamelCaseToTitleCase(name) {
    var result = name.replace(/[A-Z]/g, ' $&');
    result = result.charAt(0).toUpperCase() + result.slice(1);
    return result;
  }

  EventRegistry.getUserFriendlySingularName = function(typeName) {
    var typeInfo = EventRegistry.getEventTypeInfoByTypeName(typeName);
    var str = typeInfo.metadata.name;
    return convertCamelCaseToTitleCase(str);
  };

  EventRegistry.getUserFriendlyPluralName = function(typeName) {
    var typeInfo = EventRegistry.getEventTypeInfoByTypeName(typeName);
    var str = typeInfo.metadata.pluralName;
    return convertCamelCaseToTitleCase(str);
  };

  return {
    Event: Event,
    EventRegistry: EventRegistry
  };
});
</script>
