/**
 * Copyright (c) Meta Platforms, Inc. and affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 *
 * @format
 * @flow strict
 */

import type {HighResTimeStamp, PerformanceEntryJSON} from './PerformanceEntry';

import {PerformanceEntry} from './PerformanceEntry';

export type PerformanceEventTimingJSON = {
  ...PerformanceEntryJSON,
  processingStart: HighResTimeStamp,
  processingEnd: HighResTimeStamp,
  interactionId: number,
  ...
};

export default class PerformanceEventTiming extends PerformanceEntry {
  processingStart: HighResTimeStamp;
  processingEnd: HighResTimeStamp;
  interactionId: number;

  constructor(init: {
    name: string,
    startTime?: HighResTimeStamp,
    duration?: HighResTimeStamp,
    processingStart?: HighResTimeStamp,
    processingEnd?: HighResTimeStamp,
    interactionId?: number,
  }) {
    super({
      name: init.name,
      entryType: 'event',
      startTime: init.startTime ?? 0,
      duration: init.duration ?? 0,
    });
    this.processingStart = init.processingStart ?? 0;
    this.processingEnd = init.processingEnd ?? 0;
    this.interactionId = init.interactionId ?? 0;
  }

  toJSON(): PerformanceEventTimingJSON {
    return {
      ...super.toJSON(),
      processingStart: this.processingStart,
      processingEnd: this.processingEnd,
      interactionId: this.interactionId,
    };
  }
}
