const { ccclass, property } = cc._decorator;

@ccclass
export default class Home extends cc.Component {

    @property(cc.Label)
    objectNumLabel: cc.Label = null;

    @property(cc.Slider)
    objectNumSlider: cc.Slider = null;

    @property(cc.Node)
    enbaleMultiNode: cc.Node = null;

    @property(cc.Node)
    objects: cc.Node = null;

    nums = [10, 10000];
    num = this.nums[0];

    enableMultiRender = true;

    prefabs: cc.Node[] = [];

    protected onLoad(): void {
        this.prefabs = this.objects.children.concat();
        this.objects.removeAllChildren(false);

        // Native 暂不支持 Spine 组件与其它组件合批
        if (CC_JSB) {
            this.prefabs = this.prefabs.filter(v => !v.getComponent(sp.Skeleton));
        }

        this.objectNumSlider.node.on('slide', (slider: cc.Slider) => {
            const offset = (this.nums[1] - this.nums[0]) * slider.progress;
            this.num = this.nums[0] + Math.ceil(offset);
            this.numUpdate();
        });

        this.enbaleMultiNode.on('toggle', (toggle: cc.Toggle) => {
            this.enableMultiRender = toggle.isChecked;
            this.multiRenderUpdate();
        });

        this.objectNumSlider.progress = 0.02;
        const offset = (this.nums[1] - this.nums[0]) * this.objectNumSlider.progress;
        this.num = this.nums[0] + Math.ceil(offset);
        this.numUpdate();
        this.multiRenderUpdate();
    }


    numUpdate() {
        this.objectNumLabel.string = `对象数量：${this.num}`;

        let offset = this.num - this.objects.children.length;

        if (offset > 0) {
            for (let i = 0; i < offset; i++) {
                this.createObject();
            }
        } else {
            offset = -offset;
            for (let i = 0; i < offset; i++) {
                this.objects.children[i].destroy();
            }
        }
    }


    multiRenderUpdate() {
        this.reCreateObjects();
    }


    reCreateObjects() {
        this.objects.destroyAllChildren();
        for (let i = 0; i < this.num; i++) {
            this.createObject();
        }
    }


    createObject() {
        const random = Math.floor(Math.random() * this.prefabs.length);
        const node = cc.instantiate(this.prefabs[random]);

        if (this.enableMultiRender) {
            const comp = node.getComponent(cc.Label) ?? node.getComponent(cc.Sprite) ?? node.getComponent(cc.RichText) ?? node.getComponent(sp.Skeleton);
            comp.autoSwitchMaterial = cc.RenderComponent.EnableType.ENABLE;
            comp.allowDynamicAtlas = cc.RenderComponent.EnableType.ENABLE;
        }

        this.objects.addChild(node);

        node.position = cc.v3(Math.floor(Math.random() * this.objects.width), Math.floor(Math.random() * this.objects.height));
        cc.tween(node).by(3, { angle: 360 }).repeatForever().start();
    }

}
