import { SpawnManager } from './Modified027Editor/ModifiedSpawn';
import BubbleUI_Generate from './ui-generate/BubbleUI_generate';
/*
 * @Author: 王嵘 rong.wang@appshahe.com
 * @Date: 2022-10-27 09:49:26
 * @LastEditTime: 2023-11-13 17:01:34
 * @Description: 聊天模块
 */


export class QuickTalkModule_C extends ModuleC<QuickTalkModule_S, null> {


    onEnterScene(sceneType: number): void {

    }

    onStart(): void {

    }

    onUpdate(dt: number): void {
    }

    //-------------------------------展示表情特效-------------------------------
    /**播放的上一个表情 */
    private _lastEmojiMap: Map<number, string> = new Map<number, string>();
    /**表情计时器tag */
    private _emojiCDMap: Map<number, number> = new Map<number, number>();
    /**播放表情特效*/
    public playEmojiEffect(id: string) {
        this.server.net_playEmojiEffectS(id, Player.localPlayer);
    }

    net_playEmojiEffectC(id: string, player: mw.Player) {
        if (!player.character.getVisibility()) return;
        let playerId = player.playerId;
        this.hideHeadUI(playerId);
        this.hideEmoji(player);
        this._lastEmojiMap.set(playerId, id);
        const effectId = EffectService.playOnGameObject(id, player.character, { slotType: mw.HumanoidSlotType.ChatFrame, loopCount: 0 });
        let tag = setTimeout(() => {
            this.hideEmoji(player, effectId);
        }, 4000);
        this._emojiCDMap.set(playerId, tag);
    }

    hideEmoji(player: mw.Player,id?:number) {
        let playerId = player.playerId;
        if (this._emojiCDMap.has(playerId)) {
            clearTimeout(this._emojiCDMap.get(playerId));
            this._emojiCDMap.delete(playerId);
        }
        if (this._lastEmojiMap.has(playerId)) {
            EffectService.stop(id);
            this._lastEmojiMap.delete(playerId);
        }
    }

    /**快捷对话 */
    public playQuickTalk(str: string) {
        if (str.length === 0) return;
        this.server.net_quickTalkS(str, Player.localPlayer);
    }

    net_quickTalkC(str: string, player: mw.Player) {
        if (!player.character.getVisibility()) return;
        this.hideEmoji(player);
        this.showHeadUI(str, player.playerId);
    }

    //-------------------------------展示头顶UI-------------------------------
    private _headuiMap = new Map<number, mw.UIWidget>(); //管理玩家的头顶UI
    private _headuiCDMap = new Map<number, number>();   //管理不同headUI的计时器

    //TODO 隐藏名字
    /**世界展示headUI */
    async showHeadUI(str: string, playerId: number) {
        if (this._headuiMap.has(playerId)) {
            this.setHeadUI(playerId, str);
        } else {
            await this.initHeadUI(playerId);
            this.setHeadUI(playerId, str);
            // this.setHeadUI(playerId, str);
        }
    }

    /**渲染头顶UI样式 */
    setHeadUI(playerId: number, str: string) {
        let headUI = this._headuiMap.get(playerId) as mw.UIWidget;
        let canvas = headUI.getTargetUIWidget().findChildByPath("myCanvas") as mw.Widget;
        let img_HeadUI = headUI.getTargetUIWidget().findChildByPath("myCanvas/Image_1") as mw.Image;
        //let emoji_HeadUI = headUI.getUI().findChildByPath("myCanvas/Image_2") as mw.Image;
        let txt_HeadUI = headUI.getTargetUIWidget().findChildByPath("myCanvas/TextBlock_1") as mw.TextBlock;;

        //高度计算: （字符串长度*字号*1.5/文本框宽度 + 1）*字号*1.2 其中，1.5,1.2为比例系数
        txt_HeadUI.text = str;
        txt_HeadUI.textVerticalJustification = mw.TextVerticalJustify.Top;
        txt_HeadUI.invalidateLayoutAndVolatility()
        setTimeout(() => {
            let height = (str.length * 24 * 1.5 / 350 + 1) * txt_HeadUI.textSingleHeight;
            //let size = new mw.Vector2(350, txt_HeadUI.textHeight);
            let size = new mw.Vector2(350, height);
            txt_HeadUI.size = size;
            txt_HeadUI.position = new mw.Vector2(25, 30);
            size.x += 50;
            size.y += 60;   //60为边距
            img_HeadUI.size = size;
            canvas.size = size;
            headUI.drawSize = size;
            headUI.localTransform.position = (new mw.Vector(0, 0, 80));
            // headUI.setVisibility(mw.PropertyStatus.On);
        }, 1);

        //--------------关闭 头顶UI------------------
        let time = 4000 + (str.length / 50) * 1000;	//每50字符增加1s 显示时间

        let tag = this._headuiCDMap.get(playerId)
        if (tag) {
            clearTimeout(tag);
        }
        tag = setTimeout(() => {
            this.hideHeadUI(playerId);
        }, time);
        this._headuiCDMap.set(playerId, tag);
    }

    //**隐藏本地headUI */
    hideHeadUI(playerId: number) {
        if (this._headuiCDMap.has(playerId)) {
            clearTimeout(this._headuiCDMap.get(playerId));
            this._headuiCDMap.delete(playerId);
        }
        if (this._headuiMap.has(playerId)) {
            (this._headuiMap.get(playerId) as mw.UIWidget).localTransform.position = (new mw.Vector(0, 0, 10000));
        }
    }

    async initHeadUI(playerId: number) {
        let headUI: mw.UIWidget;
        headUI = await (await SpawnManager.wornAsyncSpawn("16037")).asyncReady() as mw.UIWidget;
        headUI.widgetSpace = mw.WidgetSpaceMode.OverheadUI;
        let cha = Player.getPlayer(playerId).character;
        cha.attachToSlot(headUI, mw.HumanoidSlotType.Head);

        headUI.setTargetUIWidget(UIService.create(BubbleUI_Generate).uiWidgetBase);
        headUI.localTransform.position = (new mw.Vector(0, 0, 10000));
        let headUI_Panel = <mw.UserWidget>headUI.getTargetUIWidget();
        let img_HeadUI = headUI_Panel.findChildByPath("myCanvas/Image_1") as mw.Image;
        let txt_HeadUI = headUI_Panel.findChildByPath("myCanvas/TextBlock_1") as mw.TextBlock;
        let emoji_HeadUI = headUI_Panel.findChildByPath("myCanvas/Image_2") as mw.Image;
        img_HeadUI.visibility = mw.SlateVisibility.Visible;
        txt_HeadUI.visibility = mw.SlateVisibility.Visible;
        emoji_HeadUI.visibility = mw.SlateVisibility.Collapsed;

        headUI.setVisibility(mw.PropertyStatus.On);

        this._headuiMap.set(playerId, headUI);
    }
}


export class QuickTalkModule_S extends ModuleS<QuickTalkModule_C, null> {
    onPlayerJoined(player: mw.Player): void {
        // throw new Error("Method not implemented.");
    }

    onPlayerLeft(player: mw.Player): void {

    }

    onStart(): void {
    }
    /**播放表情特效 S端*/
    net_playEmojiEffectS(id: string, player?: mw.Player) {
        this.getAllClient().net_playEmojiEffectC(id, player);
    }

    /**快捷对话 */
    net_quickTalkS(str: string, player?: mw.Player) {
        this.getAllClient().net_quickTalkC(str, player);
    }

    /**服务端让自己-快捷对话 */
    net_quickTalkStoSelf(str: string, player?: mw.Player) {
        this.getClient(player).net_quickTalkC(str, player);
    }
}

