/**
 * Copyright 2015 CANAL+ Group
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import isNullOrUndefined from "../../utils/is_null_or_undefined";
import type Adaptation from "./adaptation";
import type Period from "./period";
import type Representation from "./representation";
import type { ISegment } from "./representation_index";

/** All information needed to identify a given segment. */
export interface IBufferedChunkInfos {
  adaptation: Adaptation;
  period: Period;
  representation: Representation;
  segment: ISegment;
}

/**
 * Check if two contents are the same
 * @param {Object} content1
 * @param {Object} content2
 * @returns {boolean}
 */
export function areSameContent(
  content1: IBufferedChunkInfos,
  content2: IBufferedChunkInfos,
): boolean {
  return (
    content1.segment.id === content2.segment.id &&
    content1.representation.uniqueId === content2.representation.uniqueId
  );
}

/**
 * Get string describing a given ISegment, useful for log functions.
 * @param {Object} content
 * @returns {string|null|undefined}
 */
export function getLoggableSegmentId(content: IBufferedChunkInfos | null | undefined): {
  t: string;
  p: string;
  a: string;
  r: string;
  ss: number | null;
  se: number | null;
} | null {
  if (isNullOrUndefined(content)) {
    return null;
  }
  const { period, adaptation, representation, segment } = content;
  return {
    t: adaptation.type[0],
    p: period.id,
    a: adaptation.id,
    r: representation.id,
    ss: segment.isInit ? null : segment.time,
    se: segment.isInit || !segment.complete ? null : segment.end,
  };
}
