import type DocumentFragment from '../document-fragment/DocumentFragment.js';
import TextTrackCue from './TextTrackCue.js';
import type VTTRegion from './VTTRegion.js';
import * as PropertySymbol from '../../PropertySymbol.js';

/**
 * VTTCue.
 *
 * @see https://developer.mozilla.org/en-US/docs/Web/API/VTTCue
 */
export default class VTTCue extends TextTrackCue {
	public region: VTTRegion | null = null;
	public vertical: string = '';
	public snapToLines: boolean = true;
	public line: number = 0;
	public lineAlign: string = '';
	public position: string = 'auto';
	public positionAlign: string = 'auto';
	public size: number = 100;
	public align: string = '';
	public text: string = '';

	/**
	 * Constructor.
	 *
	 * @param startTime The start time for the cue.
	 * @param endTime The end time for the cue.
	 * @param text The text of the cue.
	 */
	constructor(startTime: number, endTime: number, text: string) {
		super(PropertySymbol.illegalConstructor);

		const window = this[PropertySymbol.window];

		// TODO: Can we find a better solution for counting arguments by using the "arguments" property?

		let argumentCount = 0;

		if (startTime !== undefined) {
			argumentCount++;
		}
		if (endTime !== undefined) {
			argumentCount++;
		}
		if (text !== undefined) {
			argumentCount++;
		}

		if (argumentCount < 3) {
			throw new window.TypeError(
				`Failed to construct 'VTTCue': 3 arguments required, but only ${argumentCount} present.`
			);
		}

		startTime = Number(startTime);
		endTime = Number(endTime);

		if (isNaN(startTime) || isNaN(endTime)) {
			throw new window.TypeError(
				`Failed to construct 'VTTCue': The provided double value is non-finite.`
			);
		}

		this.startTime = startTime;
		this.endTime = endTime;
		this.text = String(text);
	}

	/**
	 * Returns the cue as HTML.
	 *
	 * @returns DocumentFragment
	 */
	public getCueAsHTML(): DocumentFragment {
		const window = this[PropertySymbol.window];
		const fragment = window.document.createDocumentFragment();
		fragment.appendChild(window.document.createTextNode(this.text));
		return fragment;
	}
}
