/*
 * @Author: dgflash
 * @Date: 2022-08-15 10:06:47
 * @LastEditors: dgflash
 * @LastEditTime: 2022-09-02 13:44:12
 */
import { BlockInputEvents, Layers, Node, Widget, find, instantiate } from "cc";
import { ViewUtil } from "../../utils/ViewUtil";
import { Notify } from "../prompt/Notify";

const ToastPrefabPath: string = 'common/prefab/notify';
const WaitPrefabPath: string = 'common/prefab/wait';

/*
 * 滚动消息提示层
 */
export class LayerNotify extends Node {
    private black!: BlockInputEvents;
    /** 等待提示资源 */
    private wait: Node = null!;
    /** 自定义弹出提示资源 */
    private notify: Node = null!;
    /** 自定义弹出提示内容资源 */
    private notifyItem: Node = null!;

    constructor(name: string) {
        super(name);

        var widget: Widget = this.addComponent(Widget);
        widget.isAlignLeft = widget.isAlignRight = widget.isAlignTop = widget.isAlignBottom = true;
        widget.left = widget.right = widget.top = widget.bottom = 0;
        widget.alignMode = 2;
        widget.enabled = true;
        this.init();
    }

    private init() {
        this.layer = Layers.Enum.UI_2D;
        this.black = this.addComponent(BlockInputEvents);
        this.black.enabled = false;
    }

    /** 打开等待提示 */
    waitOpen() {
        if (this.wait == null) this.wait = ViewUtil.createPrefabNode(WaitPrefabPath);
        if (this.wait.parent == null) {
            this.wait.parent = this;
            this.black.enabled = true;
        }
    }

    /** 关闭等待提示 */
    waitClose() {
        if (this.wait.parent) {
            this.wait.parent = null;
            this.black.enabled = false;
        }
    }

    /**
     * 渐隐飘过提示
     * @param content 文本表示
     * @param useI18n 是否使用多语言
     */
    toast(content: string, useI18n: boolean): void {
        try {
            if (this.notify == null) {
                this.notify = ViewUtil.createPrefabNode(ToastPrefabPath);
                this.notifyItem = find("item", this.notify)!;
                this.notifyItem.parent = null;
            }

            this.notify.parent = this;
            let childNode = instantiate(this.notifyItem);
            let toastCom = childNode.getChildByName("prompt")!.getComponent(Notify)!;
            childNode.parent = this.notify;

            toastCom.onComplete = () => {
                if (this.notify.children.length == 0) {
                    this.notify.parent = null;
                }
            };
            toastCom.toast(content, useI18n);

            // 超过3个提示，就施放第一个提示
            if (this.notify.children.length > 3) {
                this.notify.children[0].destroy();
            }
        }
        catch {
            console.error("从oops-game-kit项目中拷贝 assets/bundle/common/prefab/notify.prefab 与 assets/bundle/common/anim/notify.anim 覆盖到本项目中");
        }
    }
}