/**
 * @deprecated - Check @/utils/playback-profiles/index
 */

import { isApple, isTizen, isTizen55, isTv, isWebOS5 } from '../../../../utils/browser-detection';

/**
 * Checks if the client has support for the H264 codec
 *
 * @param videoTestElement - A HTML video element for testing codecs
 * @returns Determines if browser has H264 support
 */
export function hasH264Support(videoTestElement: HTMLVideoElement): boolean {
	return !!(
		videoTestElement.canPlayType &&
		videoTestElement.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"').replace(/no/, '')
	);
}

/**
 * Checks if the client has support for the H265 codec
 *
 * @param videoTestElement - A HTML video element for testing codecs
 * @returns Determines if browser has H265 support
 */
export function hasH265Support(videoTestElement: HTMLVideoElement): boolean {
	if (isTv()) {
		return true;
	}

	return !!(
		videoTestElement.canPlayType &&
		(videoTestElement.canPlayType('video/mp4; codecs="hvc1.1.L120"').replace(/no/, '') ||
			videoTestElement.canPlayType('video/mp4; codecs="hev1.1.L120"').replace(/no/, '') ||
			videoTestElement.canPlayType('video/mp4; codecs="hvc1.1.0.L120"').replace(/no/, '') ||
			videoTestElement.canPlayType('video/mp4; codecs="hev1.1.0.L120"').replace(/no/, ''))
	);
}

/**
 * Checks if the client has support for the HEVC codec
 *
 * @param videoTestElement - A HTML video element for testing codecs
 * @returns Determines if browser has HEVC Support
 */
export function hasHevcSupport(videoTestElement: HTMLVideoElement): boolean {
	if (isTv()) {
		return true;
	}

	return !!(
		!!videoTestElement.canPlayType &&
		(videoTestElement.canPlayType('video/mp4; codecs="hvc1.1.L120"').replace(/no/, '') ||
			videoTestElement.canPlayType('video/mp4; codecs="hev1.1.L120"').replace(/no/, '') ||
			videoTestElement.canPlayType('video/mp4; codecs="hvc1.1.0.L120"').replace(/no/, '') ||
			videoTestElement.canPlayType('video/mp4; codecs="hev1.1.0.L120"').replace(/no/, ''))
	);
}

/**
 * Checks if the client has support for the AV1 codec
 *
 * @param videoTestElement - A HTML video element for testing codecs
 * @returns Determines if browser has AV1 support
 */
export function hasAv1Support(videoTestElement: HTMLVideoElement): boolean {
	if ((isTizen() && isTizen55()) || (isWebOS5() && window.outerHeight >= 2160)) {
		return true;
	}

	return !!(
		videoTestElement.canPlayType &&
		videoTestElement.canPlayType('video/webm; codecs="av01.0.15M.10"').replace(/no/, '')
	);
}

/**
 * Check if the client has support for the VC1 codec
 *
 * @param videoTestElement - A HTML video element for testing codecs
 * @returns Determines if browser has VC1 support
 */
function hasVc1Support(videoTestElement: HTMLVideoElement): boolean {
	return !!(isTv() || videoTestElement.canPlayType('video/mp4; codecs="vc-1"').replace(/no/, ''));
}

/**
 * Checks if the client has support for the VP8 codec
 *
 * @param videoTestElement - A HTML video element for testing codecs
 * @returns Determines if browser has VP8 support
 */
export function hasVp8Support(videoTestElement: HTMLVideoElement): boolean {
	return !!(
		videoTestElement.canPlayType &&
		videoTestElement.canPlayType('video/webm; codecs="vp8"').replace(/no/, '')
	);
}

/**
 * Checks if the client has support for the VP9 codec
 *
 * @param videoTestElement - A HTML video element for testing codecs
 * @returns Determines if browser has VP9 support
 */
export function hasVp9Support(videoTestElement: HTMLVideoElement): boolean {
	return !!(
		videoTestElement.canPlayType &&
		videoTestElement.canPlayType('video/webm; codecs="vp9"').replace(/no/, '')
	);
}

/**
 * Queries the platform for the codecs suppers in an MP4 container.
 *
 * @param videoTestElement - A HTML video element for testing codecs
 * @returns Array of codec identifiers.
 */
export function getSupportedMP4VideoCodecs(videoTestElement: HTMLVideoElement): string[] {
	const codecs = [];

	if (hasH264Support(videoTestElement)) {
		codecs.push('h264');
	}

	if (
		hasHevcSupport(videoTestElement) && // Safari is lying on HDR and 60fps videos, use fMP4 instead
		!isApple()
	) {
		codecs.push('hevc');
	}

	if (isTv()) {
		codecs.push('mpeg2video');
	}

	if (hasVc1Support(videoTestElement)) {
		codecs.push('vc1');
	}

	if (isTizen()) {
		codecs.push('msmpeg4v2');
	}

	if (hasVp8Support(videoTestElement)) {
		codecs.push('vp8');
	}

	if (hasVp9Support(videoTestElement)) {
		codecs.push('vp9');
	}

	if (hasAv1Support(videoTestElement)) {
		codecs.push('av1');
	}

	return codecs;
}
