package com.bweb.controller;

import com.hai.common.utils.DateUtil;
import com.hai.common.utils.ResponseMsgUtil;
import com.bweb.config.SysConfig;
import com.hai.model.ResponseData;
import com.hai.service.FileUploadService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.util.*;

@RestController
@RequestMapping(value="/fileUpload")
@Api(value="文件上传")
public class FileUploadController {

	private static Logger log = LoggerFactory.getLogger(FileUploadController.class);

	@Resource
	private SysConfig sysConfig;

	@Resource
	private FileUploadService fileUploadService;
	
	@RequestMapping(value="/uploadfile",method = RequestMethod.POST)
	@ResponseBody
	@ApiOperation(value = "文件上传")
	public ResponseData uploadFile(@RequestParam(value = "files" , required = false) MultipartFile files,
								   HttpServletRequest request,
								   HttpServletResponse response) throws Exception {
		try {
			response.setHeader("Access-Control-Allow-Origin", "*");
			CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(
					request.getSession().getServletContext());
			// 判断 request 是否有文件上传,即多部分请求
			List<String> fileNames = new ArrayList<String>();
			if (multipartResolver.isMultipart(request)) {
				// 转换成多部分request
				MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
				Iterator<String> iterator = multiRequest.getFileNames();

				while (iterator.hasNext()) {
					MultipartFile file = multiRequest.getFile(iterator.next());
					if (file != null) {
						FileOutputStream out = null;
						try {
							String fileType = file.getOriginalFilename()
									.substring(file.getOriginalFilename().lastIndexOf(".") + 1);
							String fileName = file.getOriginalFilename().substring(0, file.getOriginalFilename().lastIndexOf(".")) + System.currentTimeMillis() + "." + fileType;
							String childPath = DateUtil.date2String(new Date(), "yyyyMM");
							String destDirName = sysConfig.getFileUrl() + File.separator + childPath;
							File dir = new File(destDirName);
							if (!dir.exists()) {
								dir.mkdirs();
							}
							out = new FileOutputStream(destDirName + File.separator + fileName);
							out.write(file.getBytes());
							out.flush();
							fileNames.add(childPath + "/" + fileName);
						} catch (Exception e) {
							log.error(e.getMessage(), e);
						} finally {
							if (out != null) {
								out.close();
							}
						}
					}
				}
			}
			return ResponseMsgUtil.success(fileNames);

		} catch (Exception e) {
			log.error(e.getMessage(), e);
			return ResponseMsgUtil.exception(e);
		}

	}

	@RequestMapping(value = "/fileUpload", method = RequestMethod.POST)
	@ApiOperation(value = "上传文件(新接口)")
	@ResponseBody
	public ResponseData fileUpload(@RequestParam(name = "requestFile") MultipartFile requestFile,
								   @RequestParam(value = "uploadType", required = true) String uploadType,
								   HttpServletRequest request
	) {
		try {
			CommonsMultipartResolver multipartResolver =
					new CommonsMultipartResolver(request.getSession().getServletContext());

			// 提取文件列表
			List<MultipartFile> files = new ArrayList<>();
			if (multipartResolver.isMultipart(request)) {
				MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
				Iterator<String> iterator = multiRequest.getFileNames();

				while (iterator.hasNext()) {
					MultipartFile file = multiRequest.getFile(iterator.next());
					files.add(file);
				}
			}

			// 定制参数
			Map<String, String> paramsMap = new HashMap<>();
			if ("cmsModule".equals(uploadType)) {
				paramsMap.put("pathPrefix", sysConfig.getFileUrl());
				paramsMap.put("childPath", "/CMS/module/");
				paramsMap.put("fileNameGenerator", "generateFileNameAndTimeStamp");
			} else if ("cmsPatch".equals(uploadType)) {
				paramsMap.put("pathPrefix", sysConfig.getFileUrl());
				paramsMap.put("childPath", "/CMS/html/");
				paramsMap.put("fileNameGenerator", "generateFileNameAndTimeStamp");
			} else if ("cmsImg".equals(uploadType)) {
				paramsMap.put("pathPrefix", sysConfig.getFileUrl());
				paramsMap.put("childPath", "/CMS/img/");
				paramsMap.put("fileNameGenerator", "generateFileNameAndTimeStamp");
			}

			return ResponseMsgUtil.success(fileUploadService.upload(files, paramsMap));
		} catch (Exception e) {
			log.error("FileUploadController --> addCategoryModule() error!", e);
			return ResponseMsgUtil.exception(e);
		}
	}


}
