import { Utils, Object3D } from '@uino/thing';

	/**
	 * 分层体积网格,用于创建具有多层结构的体积效果。
	 * @class VolumeLayeredMesh
	 * @public
	 * @memberof THING
	 * @example
	 * let volumeLayeredMesh = new THING.VolumeLayeredMesh({
	 *   width: 2,
	 *   height: 2,
	 *   depth: 2,
	 *   diskSize: [0.01, 0.01],
	 *   diskSpacing: [0.003, 0.003],
	 *   valueRange: [0, 1],
	 *   platteTexture: new THING.ImageTexture({ url: 'http://xxx.png' })
	 * });
	 */
class VolumeLayeredMesh extends Object3D {

/**
   * @constructor
   * @summary 构造函数
	 * @param {object} param - 配置参数
	 * @param {number} param.width - 体积宽度(默认值1)
	 * @param {number} param.height - 体积高度(默认值1)
	 * @param {number} param.depth - 体积深度(默认值1)
	 * @param {number} param.layerCount - 分层数量(默认值10)
	 * @param {number} param.opacityFactor - 透明度因子(默认值0.5)
	 * @param {Array} param.diskSize - 圆片大小 [x, y](默认值[0.008, 0.008])
	 * @param {Array} param.diskSpacing - 圆片间距 [x, y](默认值[0.002, 0.002])
	 * @param {Array} param.valueRange - 值范围 [min, max](默认值[0, 1])
	 * @param {THING.ImageTexture} param.platteTexture - 调色板纹理
	 * @param {THING.ImageTexture} param.densityTexture - 密度纹理
 */
	constructor(param) {
		super(param);

		this.scale = [param.width || 1, 1, param.depth || 1];
	}

	/**
	 *
	 * @param options
	 * @param resolve
	 * @param reject
	 *	@public
	 */
	onLoadResource(options, resolve, reject) {
		let dynamic = Utils.parseValue(options['dynamic'], false);
		if (!dynamic) {
			Utils.setTimeout(() => {
				if (this.destroyed) {
					reject(`The object had been destroyed, skip to load resources`);
				}
				else {
					let node = this.onCreateBodyNode(options);

					this.body.setNode(node);

					resolve();
				}
			});
		}
	}

	/**
	 * 创建体积分层网格的节点
	 * @param {object} params - 节点参数
	 * @param {number} params.width - 体积宽度(默认值1)
	 * @param {number} params.height - 体积高度(默认值1)
	 * @param {number} params.depth - 体积深度(默认值1)
	 * @param {Array} params.diskSize - 圆片大小 [x, y](默认值[0.008, 0.008])
	 * @param {Array} params.diskSpacing - 圆片间距 [x, y](默认值[0.002, 0.002])
	 * @param {Array} params.valueRange - 值范围 [min, max](默认值[0, 1])
	 * @param {THING.ImageTexture} params.platteTexture - 调色板纹理
	 * @returns {object} 创建的节点对象
	 * @private
	 */
	onCreateBodyNode(params) {
		const node = Utils.createObject('VolumeLayeredNode', {
			external: {
				node: this.node,
				width: Utils.parseValue(params.width, 1),
				height: Utils.parseValue(params.height, 1),
				depth: Utils.parseValue(params.depth, 1),
				layerCount: Utils.parseValue(params.layerCount, 10),
				layerRandom: Utils.parseValue(params.layerRandom, 0.01),
				diskSize: Utils.parseValue(params.diskSize, [0.008, 0.008]),
				diskSpacing: Utils.parseValue(params.diskSpacing, [0.002, 0.002]),
				valueRange: Utils.parseValue(params.valueRange, [0, 1]),
				colorRampTexture: params?.platteTexture?.getTextureResource(),
				densityTexture: params?.densityTexture?.getTextureResource(),
			}
		});
		return node;
	}

	/**
	 *
	 * @param data
	 *	@public
	 */
	setData(data) {
		this.node.setData(data);
	}

	/**
	 * 设置颜色渐变纹理
	 * @param {THING.ImageTexture} texture - 颜色渐变纹理
	 *	@public
	 */
	set colorRampTexture(texture) {
		this.node.setColorRampTexture(texture.getTextureResource());
	}

	/**
	 * 获取当前颜色渐变纹理
	 * @returns {THING.ImageTexture} 当前颜色渐变纹理
	 *	@public
	 */
	get colorRampTexture() {
		return this.node.getColorRampTexture();
	}

	/**
	 * 设置密度纹理
	 * @param {THING.ImageTexture} texture - 密度纹理
	 *	@public
	 */
	set densityTexture(texture) {
		this.node.setDensityTexture(texture.getTextureResource());
	}

	/**
	 * 获取当前密度纹理
	 * @returns {THING.ImageTexture} 当前密度纹理
	 *	@public
	 */
	get densityTexture() {
		return this.node.getDensityTexture();
	}

	/**
	 * 设置分层数量
	 * @param {number} count - 分层数量
	 *	@public
	 */
	set layerCount(count) {
		this.node.setLayerCount(count);
	}

	/**
	 * 获取当前分层数量
	 * @returns {number} 当前分层数量
	 *	@public
	 */
	get layerCount() {
		return this.node.getLayerCount();
	}

	/**
	 * 设置分层随机值
	 * @param {number} value - 随机值(范围0-1)
	 *	@public
	 */
	set layerRandom(value) {
		this.node.setLayerRandom(value);
	}

	/**
	 * 获取是否使用纯颜色
	 * @returns {boolean} 是否使用纯颜色
	 *	@public
	 */
	get usePureColor() {
		return this.node.getUsePureColor();
	}

	/**
	 * 设置是否使用纯颜色
	 * @type {boolean} value - 是否使用纯颜色
	 * @public
	 */
	set usePureColor(value) {
		this.node.setUsePureColor(value);
	}

	/**
	 * 获取当前分层随机值
	 * @returns {number} 当前分层随机值
	 *	@public
	 */
	get layerRandom() {
		return this.node.getLayerRandom();
	}

	/**
	 * 设置圆片大小
	 * @param {Array} value - 圆片大小 [x, y]
	 *	@public
	 */
	set diskSize(value) {
		this.node.setDiskSize(value);
	}

	/**
	 * 获取当前圆片大小
	 * @returns {Array} 当前圆片大小 [x, y]
	 *	@public
	 */
	get diskSize() {
		return this.node.getDiskSize();
	}

	/**
	 * 设置圆片间距
	 * @param {Array} value - 圆片间距 [x, y]
	 *	@public
	 */
	set diskSpacing(value) {
		this.node.setDiskSpacing(value);
	}

	/**
	 * 获取当前圆片间距
	 * @returns {Array} 当前圆片间距 [x, y]
	 *	@public
	 */
	get diskSpacing() {
		return this.node.getDiskSpacing();
	}

	/**
	 * 设置值范围
	 * @param {Array} value - 值范围 [min, max]
	 *	@public
	 */
	set valueRange(value) {
		this.node.setValueRange(value);
	}

	/**
	 * 获取当前值范围
	 * @returns {Array} 当前值范围 [min, max]
	 *	@public
	 */
	get valueRange() {
		return this.node.getValueRange();
	}

	/**
	 * 设置透明度因子
	 * @param {number} value - 透明度因子(默认值 0.5)
	 *	@public
	 */
	set opacityFactor(value) {
		this.node.setOpacityFactor(value);
	}

	/**
	 * 获取当前透明度因子
	 * @returns {number} 当前透明度因子
	 *	@public
	 */
	get opacityFactor() {
		return this.node.getOpacityFactor();
	}

}

export { VolumeLayeredMesh };