import extend from "./extend";
import Tone from "./tone";

/**
 * 消息类
 * 在显示消息内容时执行额外操作，比如提示音等
 */
class Message {
    /**
     * 提示音
     */
    tone = new Tone();

    /**
     * 提示
     * @param {object} opt 参数
     * @param {string} opt.title 标题，默认 '提示'
     * @param {string} opt.content 内容，默认 ''
     * @param {boolean} opt.showCancel 是否显示取消按钮，默认为 true
     * @param {boolean} opt.isPlayFailVoice 是否播放错误提示音, 默认 false
     * @returns {boolean} 是否确认
     */
    alert(opt) {
        if (!extend.isObject(opt)) {
            opt = {};
        }
        if (extend.isEmptyString(opt.title)) {
            opt.title = '提示';
        }
        if (extend.isEmptyString(opt.content)) {
            opt.content = '';
        }
        if (!extend.isBool(opt.showCancel)) {
            opt.showCancel = true;
        }
        let _this = this;
        return new Promise((resolve, reject) => {
            if (opt.isPlayFailVoice) {
                _this.tone.playDing();
            }
            uni.showModal({
                title: opt.title,
                content: opt.content,
                showCancel: opt.showCancel,
                success(res) {
                    if (res.confirm) {
                        resolve(true);
                    } else {
                        resolve(false);
                    }
                }
            });
        });
    }

    /**
     * 显示消息提示
     * @param {object} opt 参数
     * @param {string} opt.icon 图标，默认 none
     * @param {string} opt.title 标题
     * @param {boolean} opt.mask 是否显示透明蒙层，防止触摸穿透，默认：false
     * @param {number} opt.duration 提示的延迟时间，单位毫秒，默认：2000
     * @param {boolean} opt.isPlayFailVoice 是否播放错误提示音, 默认 false
     */
    show(opt) {
        if (!extend.isObject(opt)) {
            opt = {};
        }
        if (extend.isEmptyString(opt.icon)) {
            opt.icon = 'none';
        }
        if (!extend.isString(opt.title)) {
            opt.title = '';
        }
        if (!extend.isBool(opt.mask)) {
            opt.mask = false;
        }
        if (!extend.isNumber(opt.duration)) {
            opt.duration = 2000;
        }
        if (opt.isPlayFailVoice) {
            this.tone.playDing();
        }
        uni.showToast({
            icon: opt.icon,
            title: opt.title,
            mask: opt.mask,
            duration: opt.duration
        });
    }

    /**
     * 错误
     * @param {object} opt 参数
     * @param {string} opt.title 标题，默认 '错误'
     * @param {string} opt.content 内容，默认 ''
     * @returns {boolean} 是否确认
     */
    async error(opt) {
        if (!extend.isObject(opt)) {
            opt = {};
        }
        if (extend.isEmptyString(opt.title)) {
            opt.title = '错误';
        }
        if (extend.isEmptyString(opt.content)) {
            opt.content = '';
        }
        opt.showCancel = false;
        opt.isPlayFailVoice = true;
        return await this.alert(opt);
    }

    /**
     * 显示消息提示
     * @param {object} opt 参数
     * @param {string} opt.icon 图标，默认 error
     * @param {string} opt.title 标题
     * @param {number} opt.duration 提示的延迟时间，单位毫秒，默认：2000
     * @param {boolean} opt.isPlayFailVoice 是否播放错误提示音, 默认 false
     */
    showError(opt) {
        if (!extend.isObject(opt)) {
            opt = {};
        }
        opt.icon = 'error';
        if (!extend.isString(opt.title)) {
            opt.title = '';
        }
        opt.mask = true;
        opt.isPlayFailVoice = true;
        this.show(opt);
    }
    
    playDing(){
        this.tone.playDing();
    }
}

/**
 * 消息
 */
export default new Message();