const md5 = require('./md5.js');
const ENV = require('./env.js');
var api = {
	
	/**
	 * post 请求数据  
	 * 
	 * @param string urlName url地址
	 * @param {object} data 数据对象
	 * @param function thenFun  then回调
	 * @param function catchFun catch回调
	 */
	post:function(urlName, data, thenFun,catchFun) {
		//数据组合
		var newData = Object.assign(api.setSign(data), ENV.appData());
		uni.$u.http.post(urlName, newData).then(res => {
				 if(thenFun) thenFun(res);
	    }).catch((rs) =>{
					if(catchFun) catchFun(rs);
				});
	},
	/**
	 * oss上传图片   
	 * 
	
	 * @param {object} data 数据对象 {filePath:'',fileType:'image',scene:'user_small'}
	 * scene //对应文件配置file->file_type列表类型   
	 *  "back_icon": "后端图标",
        "back_small": "后端小图",
        "back_centre": "后端中图",
        "back_max": "后端大图",
        "user_small": "用户端小图",
        "user_centre": "用户端中图",
        "user_max": "用户端大图",
        "user_portrait": "用户面部模型"
	 * @param function thenFun  then回调
	 * @param function catchFun catch回调	
	 */
	
	ossUpload:function(data,ossthenFun,osscatchFun){
		//从http://tmp/IX45zGr8kI1Tb1fd2c2b3045e9bfce734869d2024805.png 中
		//提取 IX45zGr8kI1Tb1fd2c2b3045e9bfce734869d2024805.png 文件名
		//获取文件名
		var fileName = data.filePath.split('/').pop();
		//获取文件格式
		var suffixArr = fileName.split('.');
		var suffix = suffixArr[1];
		//先获取oss签名
		api.post('api/aliSignature',{
			scene:data.scene,
			appoint:1,
			filename:fileName,
		},function(res){
			console.log('签名成功',res);
			var ossConfig = res;
			data.ossConfig = ossConfig;
			 api.upload(ossConfig.host,data,function(rs){
				
				var file_url = ossConfig.dir ? ossConfig.dir + (fileName ? '/' + fileName : '') : ossConfig.key;
				file_url = `/${file_url}`;
				//console.log(file_url);
				rs.data.file_url = file_url;
				console.log('上传成功',rs);
				if(ossthenFun) ossthenFun(rs);
			},function(er){
				console.log('上传失败',er);
				if(osscatchFun) osscatchFun(er);
			}); 
		
		},function(err){
			console.log('签名失败',err);
			if(osscatchFun) osscatchFun(err);
		});
	},
	
	
	/**
	 * get 请求数据  
	 * 
	 * @param string urlName url地址
	 * @param {object} data 数据对象
	 * @param function thenFun  then回调
	 * @param function catchFun catch回调
	 */
	get:function(urlName, data, thenFun,catchFun) {
		//数据组合
		var newData = data;
		uni.$u.http.get(urlName,{params:newData}).then(res => {
				 if(thenFun) thenFun(res);
	    }).catch((rs) =>{
					if(catchFun) catchFun(rs);
				});
	},
	
	/**
	 * put 请求数据  
	 * 
	 * @param string urlName url地址
	 * @param {object} data 数据对象
	 * @param function thenFun  then回调
	 * @param function catchFun catch回调
	 */
	put:function(urlName, data, thenFun,catchFun) {
		//数据组合
		var newData = Object.assign(api.setSign(data), ENV.appData());
		uni.$u.http.put(urlName, newData).then(res => {
				 if(thenFun) thenFun(res);
	    }).catch((rs) =>{
					if(catchFun) catchFun(rs);
				});
	},
	/**
	 * delete 请求数据  
	 * 
	 * @param string urlName url地址
	 * @param {object} data 数据对象
	 * @param function thenFun  then回调
	 * @param function catchFun catch回调
	 */
	delete:function(urlName, data, thenFun,catchFun) {
		//数据组合
		var newData = Object.assign(api.setSign(data), ENV.appData());
		uni.$u.http.delete(urlName, newData).then(res => {
				 if(thenFun) thenFun(res);
	    }).catch((rs) =>{
					if(catchFun) catchFun(rs);
				});
	},
	/**
	 * upload 请求数据  
	 * 
	 * @param string urlName url地址
	 * @param {object} data 数据对象 {filePath:'',fileType:'image'}
	 * @param function thenFun  then回调
	 * @param function catchFun catch回调
	 */
	upload:function(urlName, data, thenFun,catchFun){
		var newData = data;
		var formData = {};
		console.log('判断是否存在',data.hasOwnProperty('ossConfig'))
		if(data.hasOwnProperty('ossConfig'))
		{
			var ossConfig = data.ossConfig;
			var fileNameOss = ossConfig.fileName;
			var key = ossConfig.dir ? ossConfig.dir + (fileNameOss ? '/' + fileNameOss : '') : ossConfig.key;
			var newFormData ={
				key: key,
				OSSAccessKeyId: ossConfig.accessId,
				policy: ossConfig.policy, // 输入你获取的的policy
				success_action_status: '200', // 让服务端返回200,不然，默认会返回204
				signature: ossConfig.signature, // 输入你获取的的signature
			};
			formData = newFormData;
		}
		
		uni.$u.http.upload(urlName, {
		params: {}, /* 会加在url上 */
		// #ifdef MP-ALIPAY
		fileType: newData.fileType, // 仅支付宝小程序，且必填。image/video/audio
		// #endif
		filePath: newData.filePath, // 要上传文件资源的路径。
		// 注：如果局部custom与全局custom有同名属性，则后面的属性会覆盖前面的属性，相当于Object.assign(全局，局部)
		custom: {auth:true,toast:true,}, // 可以加一些自定义参数，在拦截器等地方使用。比如这里我加了一个auth，可在拦截器里拿到，如果true就传token
		name: 'file', // 文件对应的 key , 开发者在服务器端通过这个 key 可以获取到文件二进制内容
		// #ifdef H5 || APP-PLUS
		timeout: 60000, // H5(HBuilderX 2.9.9+)、APP(HBuilderX 2.9.9+)
		// #endif
		header: {
			"Content-Type": "multipart/form-data"
		},  /* 会与全局header合并，如有同名属性，局部覆盖全局 */
		formData: formData, // HTTP 请求中其他额外的 form data
		// 返回当前请求的task, options。请勿在此处修改options。非必填
		getTask: (task, options) => {
			console.log(options);
		  task.onProgressUpdate((res) => {
			console.log('上传进度' + res.progress);
			console.log('已经上传的数据长度' + res.totalBytesSent);
			console.log('预期需要上传的数据总长度' + res.totalBytesExpectedToSend);
		  });
		},
    }).then(res => {
		
		console.log('upload then success !!!',res);
				 if(thenFun) thenFun(res);
		}).catch((rs) =>{
			console.log('upload catch err !!!',rs);
					if(catchFun) catchFun(rs);
				});
	},
	
	
	setSign:function(data) {
		const date = parseInt(new Date().getTime() / 1000);
		const str = date + 'xingzhi&&2021';
		data.i_app_timestamp = date;
		data.i_app_key = md5(str);
		//判断登录  openid 和  unionid 的来源 
		// #ifdef APP-PLUS 
		   data.i_app_platform  = 'APP-PLUS'; 
		// #endif
		
		// #ifdef MP
			//微信小程序
		   // #ifdef MP-WEIXIN
		      data.i_app_platform  = 'MP-WEIXIN'; 
		   // #endif 
		   
		   //支付宝小程序
		   // #ifdef MP-ALIPAY
		      data.i_app_platform  = 'MP-ALIPAY'; 
		   // #endif 	
		   
		   //百度小程序
		   // #ifdef MP-BAIDU
		      data.i_app_platform  = 'MP-BAIDU'; 
		   // #endif 	
		   
		  //头条小程序
		  // #ifdef MP-TOUTIAO
		     data.i_app_platform  = 'MP-TOUTIAO'; 
		  // #endif 	 
		  
		  //QQ小程序
		  // #ifdef MP-QQ
		     data.i_app_platform  = 'MP-QQ'; 
		  // #endif 	 
		  
		  //360小程序
		  // #ifdef MP-360
		     data.i_app_platform  = 'MP-360'; 
		  // #endif  
		   
		   
		   
		// #endif  
		
		// #ifdef H5
		   data.i_app_platform  = 'H5'; 
		// #endif  
		//语言包
			data.i_app_lang ='zh';
		//系统
		    data.i_app_system = uni.getStorageSync('app_system');
			
		//这里是token 如果登录每个接口都需要这个	
		const token = uni.getStorageSync('token');
		if(token.length > 0)
		{
			data.token = token;
		}	
		return data;
	},
	/**
	 * 返回域名
	 * 
	 */
	domain:function() {
		return ENV.CdnUrl;
	},
	/**
	 * 返回接口地址
	 * 
	 */
	api:function() {
		return ENV.ApiUrl;
	},
	/**
	 * 返回接口环境
	 * 
	 */
	env:function(){
		return ENV.EnvShow;
	},
	/**
	 * oss 地址
	 * 
	 */
	ossurl(url){
		const app_config = uni.getStorageSync('app_config');
		return app_config.public_url + url;
	},
	
	getOssurl(){
		const app_config = uni.getStorageSync('app_config');
		return app_config.public_url;
	},
}
module.exports = api;
