/**
 * @file 视频记录
 * @author jiaochunxiao@baidu.com
 */

export default class RecordVideo {

    /**
     * 构造函数
     *
     * @param  {Object}   videoObj 视频对象
     */
    constructor(videoObj) {
        this.video = videoObj;
        this.mediaRecorder = null;
        this.chunks = [];
    }

    /**
     * 初始化
     *
     * @return {Object} promise
     */
    init() {
        // 返回Promise对象
        // resolve 正常处理
        // reject 处理异常情况
        return new Promise((resovle, reject) => {
            navigator
                .mediaDevices
                .getUserMedia({
                    audio: true,
                    video: true
                    // video: {
                    //     width: this.videoWidth,
                    //     height: this.videoHeight
                    // }
                })
                // 返回一个媒体内容的流
                .then(stream => {
                    // 检测是否支持 srcObject，该属性在新的浏览器支持
                    if ('srcObject' in this.video) {
                        this.video.srcObject = stream;
                    }
                    else {
                        // 兼容旧的浏览器
                        this.video.src = window.URL.createObjectURL(stream);
                    }
                    // 当视频的元数据已经加载时触发
                    this.video.addEventListener('loadmetadata', () => {
                        this.video.play();
                    });

                    this.mediaRecorder = new MediaRecorder(stream);
                    this.mediaRecorder.addEventListener('dataavailable', e => {
                        this.chunks.push(e.data);
                    });
                    resovle();
                })
                // 异常抓取，包括用于禁用麦克风、摄像头
                .catch(error => {
                    reject(error);
                });
        });
    }

    /**
     * 视频开始录制
     */
    startRecord() {
        if (this.mediaRecorder.state === 'inactive') {
            this.mediaRecorder.start();
        }
    }

    /**
     * 视频结束录制
     */
    stopRecord() {
        if (this.mediaRecorder.state === 'recording') {
            this.mediaRecorder.stop();
        }
    }

    /**
     * 检测当前浏览器对否支持
     *
     * @return {boolean} 当前浏览器是否支持
     */
    isSupport() {
        const flag = navigator.mediaDevices && navigator.mediaDevices.getUserMedia;
        if (flag) {
            return true;
        }
    }
}
