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

// const registerComponentParam = { isResident: true };

/**
 * PointLight - 点光源
 * 
 * 从一个点向四周均匀发光的灯光,类似灯泡效果,支持阴影、距离衰减。
 * 
 * @class PointLight
 * @memberof THING
 * @extends THING.BaseShadowLight
 * @public
 * 
 * @example
 const light = new THING.PointLight({
   position: [0, 5, 0],
   color: '#ffff00',
   intensity: 1,
   distance: 20,
   decay: 1,
 });
 */
class PointLight extends BaseShadowLight {

	/**
	 * 构造函数
	 * @param {object} param 初始参数列表
	 * @param {number[]} param.position 灯光位置
	 * @param {number|string|number[]} param.color 光的颜色
	 * @param {number} param.intensity 光的强度
	 * @param {number} param.distance 照射距离
	 * @param {number} param.decay 衰减系数
	 * @constructor
	 * @public
	 */
	constructor(param = {}) {
		super(param);
	}

	// #region Overrides

	onCopy(object) {
		super.onCopy(object);

		this.distance = object.distance;
		this.decay = object.decay;
	}

	onBeforeSetup(param) {
		param['renderableNode'] = param['renderableNode'] || Utils.createObject('PointLight', { app: this.app });
		param['castShadow'] = param['castShadow'] === undefined ? false : param['castShadow'];

		super.onBeforeSetup(param);
	}

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

	// 	this.addComponent(SpotLightHelperComponent, 'helper', registerComponentParam);
	// }

	onSetupComplete(param) {
		super.onSetupComplete(param);

		// Sync options
		Utils.syncOptions(this, [
			'distance',
			'decay',
		], param, param['extras'] || param['external']);
	}

	onExportExternalData() {
		let external = Object.assign({}, super.onExportExternalData());
		Utils.setAttributeIfExist(external, 'distance', this);
		Utils.setAttributeIfExist(external, 'decay', this);
		return external;
	}

	// #endregion

	// #region Accessor

	/**
	 * 照射距离
	 * @type {number}
	 * @public
	 */
	get distance() {
		return this.bodyNode.getDistance();
	}
	set distance(value) {
		this.bodyNode.setDistance(value);
	}

	/**
	 * 衰减系数
	 * @type {number}
	 * @public
	 */
	get decay() {
		return this.bodyNode.getDecay();
	}
	set decay(value) {
		this.bodyNode.setDecay(value);
	}

	// #endregion

	get isPointLight() {
		return true;
	}

}

export { PointLight }