/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

/**
 * A common list of systems, surfaces, controls, etc. from which user
 * interactions with tabs could originate. These "source" values
 * should be sent as extra data with tab-related metrics events.
 */
const METRIC_SOURCE = Object.freeze({
  // Tab overflow menu/"list all tabs" menu
  TAB_OVERFLOW_MENU: "tab_overflow",
  // Tab group context menu (right-clicking on a tab group label)
  TAB_GROUP_MENU: "tab_group",
  CANCEL_TAB_GROUP_CREATION: "cancel_create",
  // Tab context menu (right-clicking on a tab)
  TAB_MENU: "tab_menu",
  TAB_STRIP: "tab_strip",
  DRAG_AND_DROP: "drag",
  // "Search & Suggest," i.e. URL bar suggested actions while typing
  SUGGEST: "suggest",
  // History > Recently Closed Tabs menu, undo recently closed tab, etc.
  RECENT_TABS: "recent",
  UNKNOWN: "unknown",
});

const METRIC_TABS_LAYOUT = Object.freeze({
  HORIZONTAL: "horizontal",
  VERTICAL: "vertical",
});

const METRIC_REOPEN_TYPE = Object.freeze({
  SAVED: "saved",
  DELETED: "deleted",
});

const METRIC_GROUP_TYPE = Object.freeze({
  EXPANDED: "expanded",
  COLLAPSED: "collapsed",
  SAVED: "saved",
});

/**
 * @typedef {object} TabMetricsContext
 * @property {boolean} [isUserTriggered=false]
 *   Should be true if there was an explicit action/request from the user
 *   (as opposed to some action being taken internally or for technical
 *   bookkeeping reasons alone). This causes telemetry events to fire.
 * @property {string} [telemetrySource="unknown"]
 *   The system, surface, or control the user used to take this action.
 *   @see TabMetrics.METRIC_SOURCE for possible values.
 *   Defaults to "unknown".
 */

/**
 * Creates a `TabMetricsContext` object for a user event originating from
 * the specified source.
 *
 * @param {string} telemetrySource
 *   @see TabMetrics.METRIC_SOURCE
 * @returns {TabMetricsContext}
 */
function userTriggeredContext(telemetrySource) {
  telemetrySource = telemetrySource || METRIC_SOURCE.UNKNOWN;
  return {
    isUserTriggered: true,
    telemetrySource,
  };
}

export const TabMetrics = {
  METRIC_SOURCE,
  METRIC_TABS_LAYOUT,
  METRIC_REOPEN_TYPE,
  METRIC_GROUP_TYPE,
  userTriggeredContext,
};
