import { DefaultLevelControl } from "./DefaultLevelControl";
import { LevelControlHelper } from "../LevelControlHelper";

/**
 * @class FloorLevelControl
 * 园区的楼层层级控制类。
 * @extends THING.DefaultLevelControl
 * @public
 */
class FloorLevelControl extends DefaultLevelControl {

    static levelCondition = 'tags:or(Floor)';

    static levelName = 'floor';

    constructor(options) {
        super(options);
    }

    onSetEffect(param) {
        const object = param.current;
        if (object) {
            LevelControlHelper.traverseByIgnore(object, 'ignoreVisible', (child) => {
                if (child.tags.has('RoomRoof') || child.tags.has('Roof')) {
                    child.setVisible(false, false);
                } else {
                    child.setVisible(true, false);
                }
            });

            const brothers = object.brothers;
            brothers.forEach(element => {
                LevelControlHelper.traverseByIgnore(element, 'ignoreVisible', (child) => {
                    child.setVisible(false, false);
                });
            });;
        }

    }

    filterObject(object) {
        if (object.tags.has('Wall')) {
            return null;
        }

        if (object.tags.has('Slab') || object.tags.has('Roof') || object.tags.has('Ceiling')) {
            return null;
        }

        if (object.parents.find('tags:or(Misc,Wall)')) {
            return null;
        }

        return super.filterObject(object);
    }

    onFlyTo(flyParam) {
        const target = flyParam.target;

        if (target && target.isObject3D) {
            const boundingBox = target.boundingBox;

            flyParam.position = LevelControlHelper.getNearestObjectPosition({
                target: target,
                boundingBox: boundingBox,
                camera: this.app.camera,
            });

            flyParam.target = boundingBox.center;
        }

        return super.onFlyTo(flyParam);
    }

}

export { FloorLevelControl };