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

function _getParam(radius, param) {
	if (Utils.isObject(radius)) {
		return radius;
	}

	return param;
}

function _buildParam(radius, param) {
	param = _getParam(radius, param);

	param['body'] = param['body'] || {};

	if (!param['body']['localScale']) {
		let fixedRadius = Math.max(Number.EPSILON, Utils.parseFloat(radius, Utils.parseFloat(param['radius'], 0.5)));
		let scale = fixedRadius * 2;

		param['body']['localScale'] = [scale, scale, scale];
	}

	param['instanceGroupName'] = param['instanceGroupName'] || 'Sphere';

	return param;
}

/**
 * Sphere - 球体几何体
 * 
 * 用于创建球体模型,支持自定义半径和细分。
 * 
 * @class Sphere
 * @memberof THING
 * @extends THING.BaseModelObject3D
 * @public
 * 
 * @example
 * const s = new THING.Sphere(1.1, {
 *   position: [5, 1.1, -5],
 *   widthSegments: 32,
 *   heightSegments: 32,
 * });
 * s.style.wireframe = true;
 */
class Sphere extends BaseModelObject3D {

	static defaultTagArray = ['Geometry'];

	/**
	 * 球体
	 * @param {number} [radius=0.5] 球体半径,单位为米
	 * @param {object} [param] 初始参数
	 * @param {number} [param.widthSegments=16] 水平(经线)方向细分数
	 * @param {number} [param.heightSegments=12] 竖直(纬线)方向细分数
	 * @constructor
	 * @public
	 */
	constructor(radius, param = {}) {
		super(_buildParam(radius, param));
	}

	// #region Accessor

	/**
	 * 获取/设置 球体半径
	 * @type {number}
	 * @default 0.5
	 * @public
	 */
	get radius() {
		let size = this.body.scale.reduce((total, num) => {
			return total + num;
		}, 0);

		return (size / 3) * 0.5;
	}
	set radius(value) {
		value *= 2;
		this._processBodyWithoutPivot((body) => {
			body.scale = [value, value, value];
		});
	}

	// #endregion

	/**
	 * Check whether it's sphere object.
	 * @type {boolean}
	 */
	get isSphere() {
		return true;
	}

}

export { Sphere }