import { Utils } from '../common/Utils'
import { BaseTickableObject3D } from './BaseTickableObject3D';
import { NodeUserDataType, InheritType } from '../const';

/**
 * @class BaseLight
 * 基础光源物体
 * @memberof THING
 * @extends THING.BaseTickableObject3D
 * @public
 */
class BaseLight extends BaseTickableObject3D {

	/**
	 * 基础光源类,负责管理光源的基本属性和行为
	 * @param {object} param 初始化参数列表
	 * @param {number|string|Array<number>} param.color 光的颜色
	 * @param {number} param.intensity 光的强度
	 */
	constructor(param = {}) {
		super(param);
	}

	onCopy(object) {
		super.onCopy(object);
		this.color = object.color;
		this.intensity = object.intensity;
	}

	onLoadResource(options, resolve, reject) {
		this.loaded = true;
		resolve()
	}

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

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

	onImportExternalData(external, options) {
		super.onImportExternalData(external, options);
		this.color = Utils.parseValue(external['color'], this.color);
		this.intensity = Utils.parseValue(external['intensity'], this.intensity);
	}

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

	onAfterSetup(param) {
		let bodyNode = this.bodyNode;

		bodyNode.setName(bodyNode.getType());

		// Never affect bounding box
		bodyNode.getUserData()[NodeUserDataType.BoundingBoxInheritType] = InheritType.Stop;
	}

	// #region Accessor

	// #region Render

	get layerMask() {
		Utils.warn('Light object can not use layer mask now');

		return super.layerMask;
	}
	set layerMask(value) {
		Utils.warn('Light object can not use layer mask now');

		super.layerMask = value;
	}

	// #endregion

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

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

		this.bodyNode.setColor(color);
	}

	/**
	 * 获取/设置光强度
	 * @type {number}
	 * @public
	 */
	get intensity() {
		return this.bodyNode.getIntensity();
	}
	set intensity(value) {
		this.bodyNode.setIntensity(value);
	}

	/**
	 * 获取/设置光照组
	 * @type {number|Array<number>}
	 * @public
	 */
	get groups() {
		return this.bodyNode.getGroups();
	}
	set groups(value) {
		// value must be Number or Array<number>
		// and if the value is Number, make it as Array<number>
		if (typeof value === 'number') {
			value = [value];
		}

		// value must be Array<number>
		if (!Array.isArray(value)) {
			throw new Error('groups must be Array<number>');
		}

		// value must be Array<number>
		if (value.some(item => typeof item !== 'number')) {
			throw new Error('groups must be Array<number>');
		}

		this.bodyNode.setGroups(value);
	}
	// #endregion

	get isLight() {
		return true;
	}

}

export { BaseLight }