import { Utils } from '../common/Utils'
import { DirectionalLightHelperComponent } from '../components/DirectionalLightHelperComponent';
import { BaseShadowLight } from './BaseShadowLight';
import { ShadowDirectionalLightAdapterComponent } from '../components/ShadowDirectionalLightAdapterComponent';

const registerComponentParam = { isResident: true };

/**
 * DirectionalLight - 平行光
 * 
 * 模拟太阳光,以固定方向照射场景中所有物体,支持阴影。
 * 
 * @class DirectionalLight
 * @memberof THING
 * @extends THING.BaseShadowLight
 * @public
 * 
 * @example
 const light = new THING.DirectionalLight({
   color: '#ffffff',
   intensity: 1,
   position: [50, 50, 50],
   target: [0, 0, 0],
   castShadow: true,
 });
 */
class DirectionalLight extends BaseShadowLight {

	/**
	 * 构造函数
	 * @param {object} param 初始化参数
	 * @param {number|string|Array<number>} param.color 光的颜色
	 * @param {number} param.intensity 光的强度
	 * @param {boolean} param.castShadow 开启/关闭阴影效果
	 * @param {number} param.shadowQuality 阴影效果品质(2的n次幂的一个数值,数值越大质量越高)
	 * @param {number} param.shadowBias 阴影偏移量
	 * @param {ShadowRangeInfo} param.shadowRange 阴影范围
	 * @param {number[]} param.position 灯光位置
	 * @param {number[]} param.target 灯光的目标位置 根据position和target可确定平行光方向
	 * @constructor
	 * @public
	 */
	constructor(param = {}) {
		super(param);
	}

	onBeforeSetup(param) {
		param['renderableNode'] = param['renderableNode'] || Utils.createObject('DirectionalLight', { app: this.app });

		super.onBeforeSetup(param);
	}

	onSetupComponent(param) {
		super.onSetupComponent(param);

		this.addComponent(ShadowDirectionalLightAdapterComponent, 'adapter', registerComponentParam);
		this.addComponent(DirectionalLightHelperComponent, 'helper', registerComponentParam);
	}

	onBeforeDestroy() {
		if (this.app.objectManager.keepAliveObjects.includes(this)) {
			return false;
		}

		if (!super.onBeforeDestroy()) {
			return false;
		}

		return true;
	}

	// #region Accessor

	/**
	 * 是否开启阴影
	 * @type {boolean}
	 * @public
	 */
	get castShadow() {
		return this.bodyNode.getCastShadow();
	}
	set castShadow(value) {
		if (this.castShadow == value) {
			return;
		}

		this.bodyNode.setCastShadow(value);

		this.adapter.needRefresh = true;
	}

	// #endregion

	/**
	 * 检查是否为DirectionalLight类型或继承自它。
	 * @type {boolean}
	 * @public
	 */
	get isDirectionalLight() {
		return true;
	}

}

export { DirectionalLight }