import extend from "./extend";

/**
 * 声音
 * @param {string} filePath 文件路径
 */
class Voice {
    /**
     * 文件路径
     */
    filePath = '';

    /**
     * 文件是否存在
     */
    has = false;

    /**
     * 状态：-1 未就绪，0 就绪，1 播放，2 暂停
     */
    status = {
        canPlay: false,
        error: false
    };

    /**
     * 音频组件控制
     */
    context = null;

    /**
     * 事件集合
     */
    events = {
        /**
         * 音频进入可以播放状态，但不保证后面可以流畅播放
         */
        onCanplay: null,

        /**
         * 音频自然播放结束事件
         */
        onEnded: null
    }

    /**
     * @param {string} filePath 文件路径
     */
    constructor(filePath) {
        this.context = uni.createInnerAudioContext();
        if (extend.isEmptyString(filePath)) {
            return;
        }
        this.filePath = filePath;

        // 注册可播放状态
        this.context.onCanplay(res => {
            this.status.error = false;
            this.status.canPlay = true;
            if (extend.isFunction(this.events.onCanplay)) {
                this.events.onCanplay(res);
            }
        });

        // 注册错误事件
        this.context.onError(res => {
            this.status.error = true;
            this.status.canPlay = false;
        });

        // 注册自然播放结束事件
        this.context.onEnded(res => {
            if (extend.isFunction(this.events.onEnded)) {
                this.events.onEnded(res);
            }
        });

        this.init();
    }

    async init() {
        this.has = await this.hasFile();
        if (this.has) {
            this.context.src = this.filePath;
        }
    }

    /**
     * 判断文件是否存在
     * @returns {boolean} 文件存在标记
     */
    hasFile() {
        return new Promise((resolve, reject) => {
            uni.getFileInfo({
                filePath: this.filePath,
                success(res) {
                    resolve(true);
                },
                fail() {
                    resolve(false);
                }
            });
        });
    }

    /**
     * 播放
     */
    play() {
        if (this.status.canPlay) {
            this.context.play();
        }
    }

    /**
     * 暂停
     */
    pause() {
        if (this.status.canPlay) {
            this.context.pause();
        }
    }

    /**
     * 停止
     */
    stop() {
        if (this.status.canPlay) {
            this.context.stop();
        }
    }

    /**
     * 销毁
     */
    destroy() {
        if (extend.isObject(this.context)) {
            this.context.destroy();
        }
    }

    /**
     * 音频进入可以播放状态，但不保证后面可以流畅播放事件
     * @param {Function} callback 事件触发时的回调方法
     */
    onCanplay(callback) {
        if (extend.isFunction(callback)) {
            this.events.onCanplay = callback;
        }
    }

    /**
     * 音频自然播放结束事件
     * @param {Function} callback 事件触发时的回调方法
     */
    onEnded(callback) {
        if (extend.isFunction(callback)) {
            this.events.onEnded = callback;
        }
    }
}

export default Voice;