// pages/doTask/doTask.js
import VODUpload from '../../utils/aliyun-upload-sdk-1.0.1.min'
const app = getApp()
const util = require("../../utils/util")
const urlDef = require("../../utils/urls")

const recordManager = wx.getRecorderManager() //录音对象
const audioContext = wx.createInnerAudioContext() //音频播放对象

var uploader = null //阿里云视频上传对象
const urls = urlDef.urls;
Page({

  /**
   * 页面的初始数据
   */
  data: {
    uploadIng: false,
    homeworkId: null,
    talkFlag: false,
    closeName: '开始录音',
    videoList: [],
    videoFlag: 0,
    imgList: [],
    audioList: [],
    audioPause: false,
    content: '',
    delItems: [],
    contents: null,
  },

  renderTime: function (date) {
    var dateee = new Date(date).toJSON();
    return new Date(+new Date(dateee) + 8 * 3600 * 1000).toISOString().replace(/T/g, ' ').replace(/\.[\d]{3}Z/, '')
  },

  getRecord: function () {
    const that = this
    if (that.data.audioList.length >= 6) {
      wx.showToast({
        title: '最多上传6段录音',
        icon: 'none'
      })
      return
    }
    if (that.data.talkFlag) {
      recordManager.stop()
      recordManager.onStop((res) => { //监听录音停止的事件
        console.log("监听录音停止事件", res)
        if (res.duration < 1000) {
          wx.showToast({
            title: '录音时间太短',
            icon: 'none'
          })
          return;
        } else {
          console.log(res)
          var tempFilePath = res.tempFilePath; // 文件临时路径
          console.log("文件临时路径", tempFilePath)
          wx.uploadFile({
            filePath: tempFilePath,
            name: 'name',
            url: urls.file_upload,
            header: util.getHeaders(),
            success(res) {
              wx.showToast({
                title: '上传成功',
              })
              const rs = JSON.parse(JSON.parse(JSON.stringify(res.data)))
              const list = [{
                url: rs.data[0].url
              }]
              that.setData({
                audioList: that.data.audioList.concat(list)
              })
            },
            fail(res) {
              wx.showToast({
                title: '上传失败',
                icon: 'none'
              })
            },
            complete(res) {
              wx.hideLoading({
                success: (res) => {},
              })
            }
          })
        }
      });
      that.setData({
        talkFlag: false,
        closeName: '开始录音'
      })
    } else {
      wx.getSetting({
        success(res) {
          if (!res.authSetting['scope.record']) {
            wx.authorize({
              scope: 'scope.record',
              success() {
                // 用户已经同意小程序使用录音功能,后续调用 wx.startRecord 接口不会弹窗询问
                const options = {}
                recordManager.start(options)
              },
              fail() {
                wx.openSetting({
                  withSubscriptions: true,
                })
              }
            })
          } else {
            that.setData({
              talkFlag: true,
              closeName: '正在录音,再次点击结束录音'
            })
            const options = {}
            recordManager.start(options)
          }
        }
      })

    }
  },

  showAudio: function (e) {
    const index = e.currentTarget.dataset.index
    if (this.data.curAudioIndex != index) {
      this.setData({
        curAudioIndex: index,
      })
      audioContext.src = this.data.audioList[index].url
      audioContext.play()
      audioContext.onEnded((res) => {
        this.setData({
          curAudioIndex: '-1',
        })
      })
    } else {
      if (this.data.audioPause) {
        audioContext.play()
        this.setData({
          audioPause: false
        })
      } else {
        audioContext.pause()
        this.setData({
          audioPause: true
        })
      }
    }
  },

  delAudio: function (e) {
    const index = e.currentTarget.dataset.index
    // this.data.audioList.splice(index, 1);
    // this.setData({
    //   audioList: this.data.audioList
    // })

    let records = this.data.audioList;
    let record = records[index];
    record.delete = 1
    this.setData({
      audioList: records
    })
  },

  uploadTap: function () {
    const that = this
    if (that.data.imgList.length >= 6) {
      wx.showToast({
        title: '最多上传6张图片',
        icon: 'none'
      })
      return
    }
    wx.chooseImage({
      count: 6,
      sourceType: ['album', 'camera'],
      success(res) {
        wx.showLoading({
          title: '上传中...',
        })
        for (var i in res.tempFilePaths) {
          wx.uploadFile({
            filePath: res.tempFilePaths[i],
            name: 'name',
            url: urls.file_upload,
            header: util.getHeaders(),
            success(res) {
              wx.showToast({
                title: '上传成功',
              })
              const rs = JSON.parse(JSON.parse(JSON.stringify(res.data)))
              const list = [{
                url: rs.data[0].url
              }]
              that.setData({
                imgList: that.data.imgList.concat(list)
              })
            },
            fail(res) {
              wx.showToast({
                title: '上传失败',
                icon: none
              })
            },
            complete(res) {
              wx.hideLoading({
                success: (res) => {},
              })
            }
          })
        }
      }
    })
  },

  showImg: function (e) {
    const index = e.currentTarget.dataset.index
    let images = this.data.imgList;
    let imgs = []
    images.map(i => {
      imgs.push(i.url)
    })
    wx.previewImage({
      current: images[index].url,
      urls: imgs,
    })
  },

  delImg: function (e) {
    const index = e.currentTarget.dataset.index
    // this.data.imgList.splice(index, 1);
    let images = this.data.imgList;
    let image = images[index]
    image.delete = 1
    this.setData({
      imgList: images
    })
  },

  upLoadVideo: function () {
    const that = this
    if (that.data.videoList.length >= 6) {
      wx.showToast({
        title: '最多上传6部视频',
        icon: 'none'
      })
      return
    }
    wx.chooseVideo({
      camera: ['album'],
      success(res) {
        var file = {
          url: res.tempFilePath,
          coverUrl: res.thumbTempFilePath
        };
        var userData = '{"Vod":{}}';
        const urls = urlDef.urls;
        let createUrl = urls.video_create_upload + '?title=' + res.tempFilePath + '&fileName=' + res.tempFilePath;
        console.log('createUploadVideo ... ');
        util.apiPost(createUrl).then((rs) => {

          let d = JSON.parse(rs.data);
          // console.log('createUploadVideo ' + JSON.stringify(d));
          that.setData({
            uploadAuth: d.UploadAuth,
            uploadAddress: d.UploadAddress,
            videoId: d.VideoId,
          })
          wx.showLoading({
            title: '上传中...',
          })
          // that.setData({
          //   uploadIng: true
          // })
          uploader.addFile(file, null, null, null, userData)
          uploader.startUpload();
          // uploader.setUploadAuthAndAddress(uploadInfo, uploadAuth, uploadAddress, videoId);
        }, e => {
          console.log('createUploadVideo error ' + JSON.stringify(e));
        });
      }
    })
  },

  showVideo: function (e) {
    const index = e.currentTarget.dataset.index
    const curVideo = this.data.videoList[index].playUrl
    this.setData({
      curVideo
    })

    this.videoContext.requestFullScreen({ // 设置全屏时视频的方向,不指定则根据宽高比自动判断。
      direction: 90 // 屏幕逆时针90度
    });
  },

  // 监听视频是否为全屏,否则直接关闭
  bindfullscreenchange: function () {
    if (this.data.videoFlag == 0) {
      this.setData({
        videoFlag: 1
      })
    } else {
      this.setData({
        videoFlag: 0,
        curVideo: ""
      })
    }
  },

  delVideo: function (e) {
    const index = e.currentTarget.dataset.index
    // this.data.videoList.splice(index, 1);
    // this.setData({
    //   videoList: this.data.videoList
    // })
    let videos = this.data.videoList;
    let video = videos[index]
    video.delete = 1
    this.setData({
      videoList: videos
    })
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    let urls = urlDef.urls;
    let stu = wx.getStorageSync('student')
    let homeworkId = options.homeworkId;
    let studentId = stu.studentId;
    this.setData({
      homeworkId: homeworkId
    })

    let params = {
      'q.homeworkId': homeworkId,
      'q.studentId': studentId
    }

    util.apiPost(urls.homework_receive, params).then(rs => {});

    util.apiPost(urls.my_homework, params).then(rs => {
      if (rs.length > 0) {
        let entity = rs[0]
        let contents;
        try {
          contents = entity
          contents.receiveDate = this.renderTime(contents.receiveDate)
          this.setData({
            contents
          })
        } catch (e) {
          contents = {};
          console.error(e);
        }

        this.setData({
          content: contents.content
        })
        let images = contents.images == null ? [] : contents.images;
        images.forEach(r => {
          r.url = urls.oss_file + 'image/' + r.url
        });

        let records = contents.records == null ? [] : contents.records;
        records.forEach(r => {
          r.url = urls.oss_file + 'file/' + r.url
        });

        let videos = contents.videos == null ? [] : contents.videos;

        this.setData({
          imgList: images,
          audioList: records,
          videoList: videos
        });


        videos.forEach(r => {
          util.apiPost(urls.video_loadInfo + r.url).then(rs => {
            r.imgUrl = rs.img
            r.playUrl = rs.url
            this.reloadVideos(r)
          });
        });
      }
    });


    this.videoContext = wx.createVideoContext('play-video'); // 	创建 video 上下文 VideoContext 对象。
    const that = this
    const createUpLoad = new VODUpload({
      //阿里账号ID,必须有值
      userId: "WaWQOn6gXod13WLEp8cr4ljUdvcbXJ",
      //网络原因失败时,重新上传次数,默认为3
      retryCount: 3,
      //网络原因失败时,重新上传间隔时间,默认为2秒
      retryDuration: 2,
      //开始上传
      'onUploadstarted': function (uploadInfo) {
        console.log("开始上传")
        // console.log("onUploadStarted:" + uploadInfo.file.name + ", endpoint:" + uploadInfo.endpoint + ", bucket:" + uploadInfo.bucket + ", object:" + uploadInfo.object)
        //上传方式1,需要根据uploadInfo.videoId是否有值,调用点播的不同接口获取uploadauth和uploadAddress,如果videoId有值,调用刷新视频上传凭证接口,否则调用创建视频上传凭证接口
        if (uploadInfo.videoId) {
          //如果uploadInfo.videoId存在,调用刷新视频上传凭证接口
        } else {
          //如果uploadInfo.videoId不存在,调用获取视频上传地址和凭证接口
        }
        //从点播服务获取的uploadAuth、uploadAddress和videoId,设置SDK
        // console.log(that.data)
        uploader.setUploadAuthAndAddress(uploadInfo, that.data.uploadAuth, that.data.uploadAddress, that.data.videoId);
      },
      //文件上传成功
      'onUploadSucceed': function (uploadInfo) {
        console.log("上传成功:" + JSON.stringify(uploadInfo))

        let vid = uploadInfo.videoId
        let stu = wx.getStorageSync('student')
        var video = {
          name: vid,
          videoId: vid,
          orgId: stu.orgId,
          size: uploadInfo.fileSize,
          title: '',
          content: ''
        };
        // 保存一个 video
        let urls = urlDef.urls
        util.apiPost(urls.video_save, video, 'application/json').then((rs) => {
          var json = {
            url: uploadInfo.videoId,
            playUrl: uploadInfo.url,
            imgUrl: uploadInfo.coverUrl
          }
          console.log('视频上传成功' + JSON.stringify(json))
          var list = [json]
          that.setData({
            videoList: that.data.videoList.concat(list)
          })
          wx.showToast({
            title: '上传成功',
          })
          that.setData({
            uploadIng: false
          })
        })
        // console.log("onUploadSucceed: " + uploadInfo.file.name + ", endpoint:" + uploadInfo.endpoint + ", bucket:" + uploadInfo.bucket + ", object:" + uploadInfo.object);
      },
      //文件上传失败
      'onUploadFailed': function (uploadInfo, code, message) {
        // console.log("onUploadFailed: file:" + uploadInfo.file.name + ",code:" + code + ", message:" + message);
        wx.showToast({
          title: '上传失败',
        })
      },
      //文件上传进度,单位:字节
      'onUploadProgress': function (uploadInfo, totalSize, loadedPercent) {
        // console.log("onUploadProgress:file:" + uploadInfo.file.name + ", fileSize:" + totalSize + ", percent:" + Math.ceil(loadedPercent * 100) + "%");
      },
      //上传凭证超时
      'onUploadTokenExpired': function (uploadInfo) {
        wx.showToast({
          title: '上传超时',
        })
        console.log("onUploadTokenExpired");
        //实现时,根据uploadInfo.videoId调用刷新视频上传凭证接口重新获取UploadAuth
        //从点播服务刷新的uploadAuth,设置到SDK里
        uploader.resumeUploadWithAuth(uploadAuth);
      },
      //全部文件上传结束
      'onUploadEnd': function (uploadInfo) {
        console.log("onUploadEnd: uploaded all the files");
      }
    });
    uploader = createUpLoad
  },

  removeUpload: function () {
    uploader.stopUpload()
    uploader.cleanList();
    wx.showToast({
      title: '取消上传',
      icon: 'none'
    })
    this.setData({
      uploadIng: false
    })
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {
    audioContext.stop()
  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {

  },
  doConfirmComplete: function () {
    console.log('homeworkId ' + this.data.homeworkId)
    let contents = {};

    let dlist = [];
    let images = [];
    if (this.data.imgList.length > 0) {
      this.data.imgList.forEach(r => {
        let fid = r.url.substring(r.url.lastIndexOf('/') + 1)
        if (r.delete == 1) {
          dlist.push({
            id: fid,
            type: 'image'
          })
        } else {
          images.push({
            url: fid
          })
        }
      });
    }

    let records = [];
    if (this.data.audioList.length > 0) {
      this.data.audioList.forEach(r => {
        let fid = r.url.substring(r.url.lastIndexOf('/') + 1)
        if (r.delete == 1) {
          dlist.push({
            id: fid,
            type: 'record'
          })
        } else {
          records.push({
            url: fid
          })
        }
      });
    }

    let videos = [];
    if (this.data.videoList.length > 0) {
      this.data.videoList.forEach(r => {
        if (r.delete == 1) {
          dlist.push({
            id: r.url,
            type: 'video'
          })
        } else {
          videos.push({
            url: r.url
          })
        }
      });
    }

    this.setData({
      delItems: dlist
    })
    contents.images = images;
    contents.videos = videos;
    contents.records = records;
    contents.content = this.data.content;

    let stu = wx.getStorageSync('student')
    let data = {
      'q.content': JSON.stringify(contents),
      'q.status': 1,
      'q.studentId': stu.studentId,
      'q.homeworkId': this.data.homeworkId
    }

    util.apiPost(urls.complete_homework, data).then(rs => {

      const msgParams = {
        'homeworkId': this.data.homeworkId,
        'studentId': stu.studentId
      };
      util.apiPost(urls.homework_complete_send_message, msgParams).then((rs) => {
        console.log('发送通知 ' + JSON.stringify(rs));
      });

      wx.showToast({
        title: '已完成作业'
      })
      setTimeout(() => {
        wx.navigateBack({
          delta: 2, // 返回上一级页面。
          success: function () {
            console.log('成功!')
          }
        })
      }, 1000)
      // 删除文件
      if (this.data.delItems.length > 0) {
        // 视频的删除跟文件的删除不一样
        let delFiles = [];
        let delVideos = [];
        this.data.delItems.forEach(r => {
          if (r.type === 'video') {
            delVideos.push(r.id);
          } else {
            delFiles.push(r.id);
          }
        });
        if (delFiles.length > 0) {
          const params = {
            'keys': delFiles
          };
          util.apiPost(urls.file_delete, params).then((rs) => {
            console.log('删除文件 ... ' + JSON.stringify(params));
          });
        }
        if (delVideos.length > 0) {
          const params = {
            'ids[]': delVideos
          }
          util.apiPost(urls.video_delete, params).then((rs) => {
            console.log('删除视频 ... ' + JSON.stringify(params));
          });
        }
      }
    })

  },
  reloadVideos: function (v) {
    let videos = this.data.videoList
    videos.map(o => {
      if (o.url == v.url) {
        o = v;
      }
    })
    this.setData({
      videoList: videos
    })
  },
  doInput: function (e) {
    this.setData({
      content: e.detail.value
    })
  }
})