/*
 * SPDX-FileCopyrightText: syuilo and misskey-project
 * SPDX-License-Identifier: AGPL-3.0-only
 */

type PartiallyPartial<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;

type VideoEl = PartiallyPartial<HTMLVideoElement, 'requestFullscreen'> & {
	webkitEnterFullscreen?(): void;
	webkitExitFullscreen?(): void;
};

type PlayerEl = PartiallyPartial<HTMLElement, 'requestFullscreen'>;

type RequestFullscreenProps = {
	readonly videoEl: VideoEl;
	readonly playerEl: PlayerEl;
	readonly options?: FullscreenOptions | null;
};

type ExitFullscreenProps = {
	readonly videoEl: VideoEl;
};

export const requestFullscreen = ({ videoEl, playerEl, options }: RequestFullscreenProps) => {
	if (playerEl.requestFullscreen != null) {
		playerEl.requestFullscreen(options ?? undefined);
		return;
	}
	if (videoEl.webkitEnterFullscreen != null) {
		videoEl.webkitEnterFullscreen();
		return;
	}
};

export const exitFullscreen = ({ videoEl }: ExitFullscreenProps) => {
	// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
	if (document.exitFullscreen != null) {
		document.exitFullscreen();
		return;
	}
	if (videoEl.webkitExitFullscreen != null) {
		videoEl.webkitExitFullscreen();
		return;
	}
};