/* 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/. */

export const MediaUtils = {
  getMetadata(aElement) {
    if (!aElement) {
      return null;
    }
    return {
      src: aElement.currentSrc ?? aElement.src,
      width: aElement.videoWidth ?? 0,
      height: aElement.videoHeight ?? 0,
      duration: aElement.duration,
      seekable: !!aElement.seekable,
      audioTrackCount:
        (aElement.audioTracks?.length ??
        aElement.mozHasAudio ??
        aElement.webkitAudioDecodedByteCount ??
        MediaUtils.isAudioElement(aElement))
          ? 1
          : 0,
      videoTrackCount:
        (aElement.videoTracks?.length ?? MediaUtils.isVideoElement(aElement))
          ? 1
          : 0,
    };
  },

  isVideoElement(aElement) {
    return (
      aElement && ChromeUtils.getClassName(aElement) === "HTMLVideoElement"
    );
  },

  isAudioElement(aElement) {
    return (
      aElement && ChromeUtils.getClassName(aElement) === "HTMLAudioElement"
    );
  },

  isMediaElement(aElement) {
    return (
      MediaUtils.isVideoElement(aElement) || MediaUtils.isAudioElement(aElement)
    );
  },

  findMediaElement(aElement) {
    return (
      MediaUtils.findVideoElement(aElement) ??
      MediaUtils.findAudioElement(aElement)
    );
  },

  findVideoElement(aElement) {
    if (!aElement) {
      return null;
    }
    if (MediaUtils.isVideoElement(aElement)) {
      return aElement;
    }
    const childrenMedia = aElement.getElementsByTagName("video");
    if (childrenMedia && childrenMedia.length) {
      return childrenMedia[0];
    }
    return null;
  },

  findAudioElement(aElement) {
    if (!aElement || MediaUtils.isAudioElement(aElement)) {
      return aElement;
    }
    const childrenMedia = aElement.getElementsByTagName("audio");
    if (childrenMedia && childrenMedia.length) {
      return childrenMedia[0];
    }
    return null;
  },
};
