import { Node, Label, Color, _decorator, tween, Vec3, Font, Prefab, instantiate, color, Layout } from 'cc';
import { NodeEx } from '../pool/NodeEx';
import { NodePool } from '../pool/NodePool';
import { resLoader } from '../res/ResLoader';

const { ccclass } = _decorator;

@ccclass('TipsComp')
class TipsComp extends NodeEx { }

export class TipsManager {

    private _root: Node = null;             //根节点
    private _font: Font = null;             //自定义字体
    private _pool = new NodePool(); //池
    private _label_name: string = "Label";

    constructor(root: Node) {
        this._root = root;
        let tips_node = new Node("Tips").addComponent(TipsComp);
        let label_node = new Node(this._label_name).addComponent(Label);
        tips_node.node.addChild(label_node.node);
        this._pool.init(tips_node.node, 10, 120, false);
    }

    /**
     * 为提示加入自定义字体  自定义字体暂时不释放
     * @param bundle 包名
     * @param url 字体路径
     * @param callback 加载成功回调
     */
    setFont(bundle: string, url: string, callback: Function = null) {
        resLoader.load(bundle, url, Font, (error: Error, res: Font) => {
            if (error) {
                console.error(error);
            } else {
                res.addRef();
                this._font = res;
                callback && callback();
            }
        });
    }

    //提示模板不释放
    setTipsNode(bundle: string, url: string, name: string, callback: Function = null) {
        resLoader.load(bundle, url, Prefab, (error: Error, res: Prefab) => {
            if (error) {
                console.error(error);
            } else {
                res.addRef();
                this._pool.clear();
                // (this._font) && this._font.decRef();
                this._font = null;
                this._label_name = name;
                let tips_node = instantiate(res).addComponent(TipsComp);
                this._pool.init(tips_node.node, 10, 120, false);
                callback && callback();
            }
        });
    }

    /**
     * 提示
     * @param str 提示文字
     * @param size 字体大小
     * @param c 字体颜色
     */
    setTips(str: string, size: number = 30, c: Color = new Color(255,255,255)) {
        let tips_node = this._pool.getNode(this._root);
        if (tips_node) {
            let label = tips_node.node.getChildByName(this._label_name).getComponent(Label);
            this._font && (label.font = this._font);
            tips_node.node.setPosition(0, 300);
            label.color = c;
            label.string = str;
            label.fontSize = size;
            label.updateRenderData(true);
            let layout = tips_node.getComponent(Layout);
            if (layout) {
                layout.type = Layout.Type.HORIZONTAL;
                layout.updateLayout(true);
                layout.type = Layout.Type.VERTICAL;
                layout.updateLayout(true);
            }
            tween(tips_node.node).delay(0.5).by(0.5, { position: new Vec3(0, 150, 0) }).call(() => {
                this._pool.putNode(tips_node);
            }).start();
        }
    }
}