package jit.edu.paas.commons.util;

import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest;
import sun.misc.BASE64Encoder;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URLEncoder;
import java.util.*;
import java.util.List;

/**
 * @author jitwxs
 * @since 2018/6/16 21:02
 */
public class FileUtils extends org.apache.commons.io.FileUtils {
    /**
     * 重命名文件
     *
     * @param path    目录路径
     * @param oldName 源文件名
     * @param newName 目标文件名
     * @return true|false
     * @author jitwxs
     * @version 创建时间:2018年2月27日 上午10:59:33
     */
    public static boolean renameFile(String path, String oldName, String newName) {
        //新的文件名和以前文件名不同时,才有必要进行重命名
        if (!oldName.equals(newName)) {
            File oldfile = new File(path + "/" + oldName);
            File newfile = new File(path + "/" + newName);
            if (!oldfile.exists()) {
                System.out.println("重命名文件失败," + oldName + "不存在!");
                return false;
            }
            //若在该目录下已经有一个文件和新文件名相同,则不允许重命名
            if (newfile.exists()) {
                System.out.println("重命名文件失败," + newName + "已经存在!");
                return false;
            } else {
                oldfile.renameTo(newfile);
            }
        }
        return true;
    }

    /**
     * 获取指定路径下所有目录
     *
     * @author jitwxs
     * @since 2018/6/16 21:03
     */
    public static List<File> listDir(String path) {
        File file = new File(path);
        List<File> list = new ArrayList<>();
        // 如果这个路径是文件夹
        if (file.isDirectory()) {
            File[] files = file.listFiles();
            for (int i = 0; i < files.length; i++) {
                // 如果还是文件夹 递归获取里面的文件 文件夹
                if (files[i].isDirectory()) {
                    list.add(files[i]);
                }
            }
        }
        return list;
    }

    /**
     * 获取后缀名
     *
     * @author jitwxs
     * @since 2018/6/17 13:30
     */
    public static String getSuffix(String fileName) {
        if (!fileName.contains(".")) {
            return "";
        }
        String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
        suffix = suffix.toLowerCase();
        return suffix;
    }

    /**
     * 获取前缀名
     *
     * @author jitwxs
     * @since 2018/6/17 13:30
     */
    public static String getPrefix(String fileName) {
        if (!fileName.contains(".")) {
            return "";
        }
        String prefix = fileName.substring(0, fileName.lastIndexOf("."));
        return prefix;
    }

    /**
     * 获取文件修改时间
     *
     * @author jitwxs
     * @since 2018/6/17 17:16
     */
    public static Date getModifiedTime(File f) {
        long time = f.lastModified();
        return new Date(time);
    }

    /**
     * 调整图片大小
     *
     * @param srcImgPath  原图片路径
     * @param distImgPath 转换大小后图片路径
     * @param width       转换后图片宽度
     * @param height      转换后图片高度
     * @author jitwxs
     * @since 2018/6/17 21:54
     */
    public static void resizeImage(String srcImgPath, String distImgPath, int width, int height) throws IOException {
        File srcFile = new File(srcImgPath);
        Image srcImg = ImageIO.read(srcFile);
        BufferedImage buffImg = null;
        buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        buffImg.getGraphics().drawImage(
                srcImg.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0,
                0, null);

        ImageIO.write(buffImg, "JPEG", new File(distImgPath));

    }

    /**
     * 上传文件,如果是SpringBoot,配置如下:
     * # 上传单个文件最大允许
     * spring.servlet.multipart.max-file-size=10MB
     * # 每次请求最大允许
     * spring.servlet.multipart.max-request-size=100MB
     *
     * @return 自定义消息
     * @author jitwxs
     * @version 创建时间:2018年4月17日 下午4:05:26
     */
    public static String upload(HttpServletRequest request) throws Exception {
        StandardMultipartHttpServletRequest req = (StandardMultipartHttpServletRequest) request;

        // 遍历普通参数(即formData的fileName和fileSize)
        Enumeration<String> names = req.getParameterNames();
        while (names.hasMoreElements()) {
            String key = names.nextElement();
            String val = req.getParameter(key);
            System.out.println("FormField:k=" + key + "v=" + val);
        }

        // 遍历文件参数(即formData的file)
        Iterator<String> iterator = req.getFileNames();
        if (iterator == null){
            return "未选择文件";
        }
        String result = "";
        while (iterator.hasNext()) {
            MultipartFile file = req.getFile(iterator.next());
            String fileNames = file.getOriginalFilename();
            // 文件名
            fileNames = new String(fileNames.getBytes("UTF-8"));
            //int split = fileNames.lastIndexOf(".");
            // 文件前缀
            //String fileName = fileNames.substring(0, split);
            // 文件后缀
            //String fileType = fileNames.substring(split + 1, fileNames.length());
            // 文件大小
            //Long fileSize = file.getSize();
            // 文件内容
            byte[] content = file.getBytes();

            File file1 = new File("D:\\test\\"+fileNames);

            FileUtils.writeByteArrayToFile(file1, content);

            FileOutputStream fos = new FileOutputStream(file1);
            fos.write(content);
            fos.flush();
            result = "D:\\test\\"+fileNames;
            System.out.println("write success");
        }
        return result;
    }

    /**
     * 下载文件
     *
     * @author jitwxs
     * @version 创建时间:2018年4月17日 下午4:06:10
     */
    public void download(HttpServletRequest request, HttpServletResponse response) throws Exception {
        String fileName = request.getParameter("fileName");
        // 文件路径
        String path = "D:\\" + fileName;
        // 得到用于返回给客户端的编码后的文件名
        String agent = request.getHeader("User-Agent");
        String fileNameEncode = solveFileNameEncode(agent, fileName);
        // 客户端判断下载文件类型
        response.setContentType(request.getSession().getServletContext().getMimeType(fileName));
        // 关闭客户端的默认解析
        response.setHeader("Content-Disposition", "attachment;filename=" + fileNameEncode);

        // 下载文件
        ServletOutputStream out = response.getOutputStream();
        InputStream in = new FileInputStream(path);
        int len;
        byte[] buf = new byte[1024];
        while ((len = in.read(buf)) > 0) {
            out.write(buf, 0, len);
        }
        in.close();
    }

    /**
     * 对文件名发送到客户端时进行编码
     *
     * @param agent
     * @param fileName
     * @author jitwxs
     * @version 创建时间:2018年4月17日 下午4:06:31
     */
    private String solveFileNameEncode(String agent, String fileName) {
        String res = "";
        try {
            if (agent.contains("MSIE")) {
                // IE浏览器
                res = URLEncoder.encode(fileName, "utf-8");
                res = res.replace("+", " ");
            } else if (agent.contains("Firefox")) {
                // 火狐浏览器
                BASE64Encoder base64Encoder = new BASE64Encoder();
                res = "=?utf-8?B?"
                        + base64Encoder.encode(fileName.getBytes("utf-8")) + "?=";
            } else {
                // 其它浏览器
                res = URLEncoder.encode(fileName, "utf-8");
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return res;
    }
}