/* global Uint8Array */

import { Utils } from '../common/Utils'

import { BaseStaticTexture } from './BaseStaticTexture';



const __ = {

	private: Symbol('private'),

}



/**
 * RenderTexture - 渲染纹理
 *
 * 用于创建渲染纹理资源,可将场景渲染结果保存为纹理用于后期处理。
 * @class RenderTexture
 * @memberof THING
 * @extends THING.BaseStaticTexture
 * @public
 * @example
 const renderTexture = new THING.RenderTexture({
   size: [512, 512],
 });
 */
class RenderTexture extends BaseStaticTexture {



	/**
	 * @param {object}param 参数列表
	 * @param {number[]} param.size 渲染纹理的尺寸,包含宽和高两个元素
	 * @constructor
	 * @public
	 */
	constructor(param = {}) {
		super(param);



		this[__.private] = {};

		let _private = this[__.private];



		_private.size = Utils.parseArray(param['size'], [1, 1]);



		// Complete

		this.onNotifyComplete();
	}



	// #region Overrides



	onDispose() {
		let _private = this[__.private];



		_private.resource = null;



		super.onDispose();
	}



	onCreateTextureResource() {
		let _private = this[__.private];



		let renderTexture = Utils.createObject('RenderTextureResource', { scene: this.app.scene.context, view: this.app.view });

		renderTexture.setSize(_private.size);



		return renderTexture;
	}



	// #endregion



	/**

	 从图片资源中拷贝数据。
	 * @param {THING.RenderTexture} source 图片源.
	 * @returns {THING.RenderTexture} 返回当前渲染纹理。
	 * @public
	 */

	copy(source) {
		super.copy(source);



		let _private = this[__.private];



		_private.size = source.size;



		return this;
	}



	/**

	 克隆图片
	 * @returns {THING.RenderTexture} 返回克隆的渲染纹理。
	 * @example

	 * let renderTexture = new THING.RenderTexture();

	 * let cloneRenderTexture = renderTexture.clone();

	 * // @expect(cloneRenderTexture !== renderTexture);
	 * @public
	 */

	clone() {
		let resource = new RenderTexture({ app: this.app });

		resource.copy(this);



		return resource;
	}



	/**

	 以PNG文件格式下载文件作为图像资源。
	 * @param {string} fileName 文件名。
	 * @example

	 * renderTexture.download('myScreenshot');
	 * @public
	 */

	download(fileName) {
		let _private = this[__.private];



		let size = _private.size;

		let imageWidth = size[0];

		let imageHeight = size[1];



		let image = Utils.saveAsImage(imageWidth, imageHeight, this.pixelBuffer);

		Utils.saveAsFile(fileName + '.png', image, 'png');
	}



	// #region Accessors



	/**

	 获取或设置大小。
	 * @type {Array<number>}
	 * @public
	 */

	get size() {
		let _private = this[__.private];



		return _private.size.slice(0);
	}

	set size(value) {
		let _private = this[__.private];



		_private.size = value.slice(0);



		this.getTextureResource().setSize(_private.size);
	}



	/**

	 获取以RGBA颜色格式的像素缓冲区。
	 * @type {Uint8Array}
	 * @example

	 * let renderTexture = new THING.RenderTexture();

	 * let pixelBuffer = renderTexture.pixelBuffer;

	 * // @expect(pixelBuffer !== null);
	 * @public
	 */

	get pixelBuffer() {
		return this.getTextureResource().getPixelBuffer();
	}



	// #endregion



	/**

	 Check class type.
	 * @type {boolean}
	 */

	get isRenderTexture() {
		return true;
	}



	// #endregion



}



export { RenderTexture }