/**
 * 处理拖拽上传
 */
 

 
var fileNumber		= -1; //上传文件编号
var fileNumberPex	= "zyFileUpload_"; //编号前缀
var currUploadfile  = {}; //当前上传的文件对象

var uploadQueue		= [];//上传队列集合
var isUploading		= false;//是否正在上传

import config from "../../../config";








/**
 * 松开拖拽文件的处理，进行上传
 */
export function handleDrop(files){
  if(!("FormData" in window)){
    return
  }
  var file={};
  var errorMsgs = [];
  var len = files.length;
  
  for(var i=0; i < len; i++){
    fileNumber ++ ;
    file = files[i];
    file.id = fileNumberPex+fileNumber;
    
    //检测文件
    let msg = checkFile(file)
    //文件可以通过
    if(!msg){
      //添加上传队列
      uploadQueue.push(file);
      //在页面进行展示
    //   fileQueued(file, 1);
    }else{
      errorMsgs.push(msg)
    }
  }
  
  if(errorMsgs.length>0){
    //只选择做一个进行上传
    			
  }
  
  
  //拿出第一个，进行上传
  if(!isUploading && uploadQueue.length>0) uploadFiles(uploadQueue.shift());
  
  
}

function uploadFilesByFetch(file){
    //正在上传
  isUploading = true;
  //设置上传的数据
  var fd = new FormData();
  fd.append("Filename", file.name);
  fd.append("avatar", file);
  fd.append("Upload", "Submit Query");
  //设置当前的上传对象
  currUploadfile = file;
  // reqPost('ll',{aa:111},(result)=>{
  //   console.log("result",result)
  // })
  fetch("./upload", {
      method:"POST",
      // headers: {
      //     'Content-Type': 'application/octet-stream',
      // },
      body:fd,
  }).then((res) => {
    // if (res.status >= 200 && res.status < 300) {
      var reader = res.body.getReader();
      var bytesReceived = 0;
    
      // read() returns a promise that resolves
      // when a value has been received
      return reader.read().then(function processResult(result) {
        // Result objects contain two properties:
        // done  - true if the stream has already given
        //         you all its data.
        // value - some data. Always undefined when
        //         done is true.
        if (result.done) {
          console.log("done",result)
          nextUpload()
          return;
        }
    
        // result.value for fetch streams is a Uint8Array
        bytesReceived += result.value.length;
        console.log('Received', bytesReceived, 'bytes of data so far');
    
        // Read some more, and call this function again
        return reader.read().then(processResult);
      });
    // } else {
    //     return Promise.reject('请求失败！');
    // }
    
      
  }).catch(error => {
      console.log(error);
      uploadError()
  })

}



// function hasSameFile(){

// }



function uploadFiles(fileMsg){
  let file = fileMsg.file;
  //正在上传
  isUploading = true;
  //设置上传的数据
  var fd = new FormData();
  fd.append("Filename", file.name);
  fd.append("avatar", file);
  fd.append("Upload", "Submit Query");
  //设置当前的上传对象
  currUploadfile = file;
  var XHR 
  try{ 
    XHR = new XMLHttpRequest(); 
  }catch(e){}
  if(XHR.readyState>0){
    XHR = new XMLHttpRequest(); 
  }
  // XHR.withCredentials = true;
  // XHR.responseType = "jsonp"
  XHR.upload.addEventListener("progress", (evt)=>{
    fileMsg.node && fileMsg.node.upProgress && fileMsg.node.upProgress(evt);
  }, false);
  XHR.upload.addEventListener("error", ()=>{
    XHR.abort();
    fileMsg.node && fileMsg.node.upFail && fileMsg.node.upFail();
    uploadError()
    nextUpload();
  }, false);
  // XHR.upload.addEventListener('abort', e => {
  //   l('上传终止')
  // },false)

  // XHR.upload.addEventListener('timeout', e => {
  //   l('由于预设时间到期，上传终止')
  // },false)

  // XHR.upload.addEventListener('load', e => {
  //   fileMsg.node && fileMsg.node.upFinish && fileMsg.node.upFinish();
  // },false)

  XHR.upload.addEventListener('loadend', e => {
    // fileMsg.node && fileMsg.node.upFinish && fileMsg.node.upFinish();
  },false)
  XHR.upload.addEventListener('loadstart', e => {
    fileMsg.node && fileMsg.node.upStart() && fileMsg.node.upStart();
  },false)
  XHR.open("POST", './upload');
  // XHR.setRequestHeader("Content-Type","application/octet-stream");
  XHR.send(fd);
  
  XHR.onreadystatechange = function() {
    
    //只要上传完成不管成功失败
    if (XHR.readyState == 4 ){
      console.log("onreadystatechange " , XHR.status, +new Date());
      
      if(XHR.status == 200){
        fileMsg.node && fileMsg.node.upFinish && fileMsg.node.upFinish();
        
      }else{
        // fileMsg.node && fileMsg.node.upFail && fileMsg.node.upFail();
      }
      
      //进行下一个上传
      nextUpload()
    }
  };
  
}

function checkFile(file) {
	
	if(file.size > config.fileLimitSize){
		return "文件太大，不能超过"+countFileSize(config.fileLimitSize);
	}
	
	// if (!file.name || !file.name.toLowerCase().match('('+config.fileTypes+')$')) {
	// 	return "文件格式不对";
	// }
	
	// var len = filesUpload.length;
	// for(var i=0; i< len; i++){
	// 	if(filesUpload[i].name == file.name)	{
	// 		return "文件已经存在";
	// 	}
	// }
	return null;
}

//请求完成，无论失败或成功
function loadend(evt){
  console.log("loadend",+new Date(),evt);
}
//请求开始
function loadstart(evt){
  console.log("loadstart",evt);
}

//在请求发送或接收数据期间，在服务器指定的时间间隔触发。
// function progress(evt){
//   // console.log(evt)
// //   uploadProgress(currUploadfile,  evt.loaded || evt.position , evt.total)
// }

//在请求被取消时触发，例如，在调用 abort() 方法时。
function abort(evt){
  console.log("abort",evt);
}

//在请求失败时触发。
function error(evt){
  //终止ajax请求
  XHR.abort();
  uploadError()
  nextUpload();
}

//在请求成功完成时触发。
function requestLoad(evt){
  console.log("requestLoad", +new Date(),evt);
}

//进行下一个上传
function nextUpload(){
  isUploading = false;
  if(uploadQueue.length>0){
    uploadFiles(uploadQueue.shift());		
  }else{
     //米有正在上传的了
     currUploadfile  = {}
  }
}

//上传出错误了，比如断网，
function uploadError(){
  var file = currUploadfile;
  console.log(file)
//   $("#handle_button_"+file.id).replaceWith("<dd>上传失败</dd>")
}


//对外部注册的函数
var HTML5Funs = {
  /**
   * 取消上传
   * @param string fid 文件的Id 
   */
  cancelUpload : function(fid){
    
    
    //如果是正在上传的，AJAX取消
    if(currUploadfile.id == fid){
      XHR.abort();
    }else{
      //从上传队列中移除
      removeFileFromFilesUpload(uploadQueue, fid)
    }
  }
}

export function removeFileFromFilesUpload(files, fid){
	
	var filesUploadKey = -1;
	
	filesUploadKey = findObjectKey(files, fid);
	//从全局文件中移除
	if(filesUploadKey > -1)
		 files.splice(filesUploadKey, 1);
		 
	return files;
}
function findObjectKey (object, fid){
	var len = object.length; 
	for(var i=0; i<len; i++){
		if(object[i].id == fid){
			return i;
		}
	}
	return -1;
}

//统计文件大小
export function countFileSize(fileSize)
{
	var KB  = 1024;
	var MB = 1024 * 1024;
	if(KB >= fileSize){
	   return fileSize+"B";
	}else if(MB >= fileSize){
		return (fileSize/KB).toFixed(2)+"KB";
	}else{
		return (fileSize/MB).toFixed(2)+"MB";
	}
}

//如果文件太长进行截取
function substr_string(name)
{
	var maxLen = 15;
	var len = name.length;
	if(len < 17 )return name;
	
	var lastIndex = name.lastIndexOf(".");
	var suffix    = name.substr(lastIndex);
	var pre       = name.substr(0,lastIndex);
	var preLen    = pre.length;
	var preStart  = preLen - 10;
	//前面10个 + 后面5个
	var fileName  =  pre.substr(0,10) + "...." + pre.substr( preStart > 4 ? -4 : -preStart , 4)+suffix;
	return fileName
}


//上传成功
function uploadSuccess(file, serverData, res)
{
	console.log("success")
}

window.HTML5Funs = HTML5Funs;

