import { ByteArray } from '../utils/ByteArray';

export class ParserUtils {
	public static arrayBufferToBase64(data: ArrayBuffer, mimeType: string): string {
		let byteStr: string = '';
		const bytes: Uint8Array = new Uint8Array(data);
		const len: number = bytes.byteLength;

		for (let i = 0; i < len; i++)
			byteStr += String.fromCharCode(bytes[ i ]);

		const base64Image: string = window.btoa(byteStr);
		return 'data:' + mimeType + ';base64,' + base64Image;
	}

	public static arrayBufferToAudio(data: ArrayBuffer, fileType: string): HTMLAudioElement {
		const str: string = ParserUtils.arrayBufferToBase64(data, 'audio/' + fileType);
		const audio: HTMLAudioElement = <HTMLAudioElement> new Audio();
		audio.src = str;
		return audio;
	}

	/**
	 * Converts an ArrayBuffer to a base64 string
	 *
	 * @param image data as a ByteArray
	 *
	 * @return HTMLImageElement
	 *
	 */
	public static arrayBufferToImage(data: ArrayBuffer): HTMLImageElement {
		const str: string = ParserUtils.arrayBufferToBase64(data, 'image/png');
		const img: HTMLImageElement = <HTMLImageElement> new Image();
		img.src = str;
		return img;
	}

	/**
	 * Converts an ByteArray to an Image - returns an HTMLImageElement
	 *
	 * @param image data as a ByteArray
	 *
	 * @return HTMLImageElement
	 *
	 */
	public static byteArrayToImage(data: ByteArray): HTMLImageElement {
		const str: string = ParserUtils.arrayBufferToBase64(data.arraybytes, 'image/png');
		const img: HTMLImageElement = <HTMLImageElement> new Image();
		img.src = str;
		return img;
	}

	public static byteArrayToAudio(data: ByteArray, filetype: string): HTMLAudioElement {
		const str: string = ParserUtils.arrayBufferToBase64(data.arraybytes, 'audio/' + filetype);
		const audio: HTMLAudioElement = <HTMLAudioElement> new Audio();
		audio.src = str;
		return audio;
	}

	/**
	 * Converts an Blob to an Image - returns an HTMLImageElement
	 *
	 * @param image data as a Blob
	 *
	 * @return HTMLImageElement
	 *
	 */
	public static blobToImage(data: Blob): HTMLImageElement {
		const URLObj = window['URL'] || window['webkitURL'];
		const src = URLObj.createObjectURL(data);
		const img: HTMLImageElement = <HTMLImageElement> new Image();
		img.src = src;
		return img;
	}

	/**
	 * Converts an Blob to audio - returns an HTMLAudioElement
	 *
	 * @param audio data as a Blob
	 *
	 * @return HTMLAudioElement
	 *
	 */
	public static blobToAudio(data: Blob): HTMLAudioElement {
		const URLObj = window['URL'] || window['webkitURL'];
		const src = URLObj.createObjectURL(data);
		const img: HTMLAudioElement = <HTMLAudioElement> new Audio();
		img.src = src;
		return img;
	}

	/**
	 * Returns a object as ByteArray, if possible.
	 *
	 * @param data The object to return as ByteArray
	 *
	 * @return The ByteArray or null
	 *
	 */
	public static toByteArray(data: any): ByteArray {
		const b: ByteArray = new ByteArray();
		b.setArrayBuffer(data);
		return b;
	}

	/**
	 * Returns a object as String, if possible.
	 *
	 * @param data The object to return as String
	 * @param length The length of the returned String
	 *
	 * @return The String or null
	 *
	 */
	public static toString(data: any, length: number = 0): string {

		if (typeof data === 'string') {
			const s: string = <string> data;

			if (s['substr'] != null)
				return s.substr(0, s.length);
		}

		if (data instanceof ByteArray) {
			const ba: ByteArray = <ByteArray> data;
			ba.position = 0;
			return ba.readUTFBytes(Math.min(ba.getBytesAvailable(), length));
		}

		return null;

		/*
		 var ba:ByteArray;

		 length ||= uint.MAX_VALUE;

		 if (data is String)
		 return String(data).substr(0, length);

		 ba = toByteArray(data);
		 if (ba) {
		 ba.position = 0;
		 return ba.readUTFBytes(Math.min(ba.bytesAvailable, length));
		 }

		 return null;

		 */

	}
}