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

/**
 * HemisphereLight - 半球光(天光)
 * 
 * 模拟天空和地面的漫反射光照,从上方照射一种颜色、从下方照射另一种颜色。
 * 
 * @class HemisphereLight
 * @memberof THING
 * @extends THING.BaseLight
 * @public
 * 
 * @example
 const light = new THING.HemisphereLight({
   color: '#87ceeb',
   groundColor: '#8b4513',
   intensity: 0.6,
 });
 */
class HemisphereLight extends BaseLight {

	/**
	 * 构造函数
	 * @param {object} param 参数对象。
	 * @param {number|string|Array<number>} param.color 光的颜色
	 * @param {number|string|Array<number>} param.groundColor 地面颜色
	 * @param {number} param.intensity 光的强度
	 * @constructor
	 * @public
	 */
	constructor(param = {}) {
		super(param);
	}

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

		this.groundColor = object.groundColor;
	}

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

		super.onBeforeSetup(param);
	}

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

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

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

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

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

		return true;
	}

	// #region Accessor

	/**
	 * 获取/设置 地面颜色
	 * @type {number|string|Array<number>}
	 * @public
	 */
	get groundColor() {
		let color = [0, 0, 0];
		this.bodyNode.getGroundColor(color);

		return Utils.colorToHexString(color);
	}
	set groundColor(value) {
		let color = Utils.parseColor(value);

		this.bodyNode.setGroundColor(color);
	}

	// #endregion

	/**
	 * Check whether it's HemisphereLight type or inherit from it.
	 * @type {boolean}
	 */
	get isHemisphereLight() {
		return true;
	}

}

export { HemisphereLight }