package com.ssm.manage.utils;


import org.apache.commons.lang3.StringUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.net.URLEncoder;
import java.util.UUID;

public class FileUtils {

    /**
     * 临时文件存放路径
     */
//    public static final String TEMP_FILE_FOLDER_PATH = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest().getServletContext().getRealPath("/");
    private static final String UTF8 = "UTF-8";


    public static int FILE_DATA = 0;

    /**
     * 加密/解密 文件
     *
     * @param srcFile 原文件
     * @param encFile 加密/解密后的文件
     * @throws Exception
     */
//    public static void cryptoFile(File srcFile, File encFile) throws Exception {
//
//        InputStream inputStream = new FileInputStream(srcFile);
//        OutputStream outputStream = new FileOutputStream(encFile);
//        while ((FILE_DATA = inputStream.read()) > -1) {
//            outputStream.write(FILE_DATA ^ CustomConstants.FILE_CRYPTO_SECRET_KEY);
//        }
//        inputStream.close();
//        outputStream.flush();
//        outputStream.close();
//    }

    /**
     * MultipartFile 生成临时文件
     *
     * @param multipartFile
     * @param tempFileFolder 临时文件存放路径
     * @return File 临时文件
     */
    public static File multipartFileToFile(MultipartFile multipartFile, String tempFileFolder) {

        File file = new File(tempFileFolder);
        // 获取文件原名
        String originalFilename = multipartFile.getOriginalFilename();
        // 获取文件后缀
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        if (!file.exists()) {
            file.mkdirs();
        }
        // 创建临时文件
        File tempFile = new File(tempFileFolder + "\\" + UUID.randomUUID().toString().replaceAll("-", "") + suffix);
        try {
            if (!tempFile.exists()) {
                // 写入临时文件
                multipartFile.transferTo(tempFile);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return tempFile;
    }

    /**
     * 上传文件
     *
     * @param fileServerPath 文件服务器地址
     * @param folderPath     存放的文件夹路径（比如存放在文件服务器的 upload 文件夹下，即 ”/upload“）
     * @param uploadFile     需要上传的文件
     * @param isCrypto       是否加密
     * @return String    文件上传后的全路径
     */
//    public static String uploadByJersey(String fileServerPath, String folderPath, File uploadFile, String isOriginalName, boolean isCrypto) {
//
//        String suffix = uploadFile.getName().substring(uploadFile.getName().lastIndexOf("."));
//        String randomFileName = isOriginalName == null ? UUID.randomUUID().toString().replaceAll("-", "") + suffix : isOriginalName + suffix;
//        String fullPath = null;
//        try {
//            fullPath = fileServerPath + folderPath + URLEncoder.encode(randomFileName, "utf-8");
//        } catch (UnsupportedEncodingException e) {
//            e.printStackTrace();
//        }
//        deleteByUrl(fullPath);
//        try {
//            if (isCrypto) {
//                // 创建加密文件
//                File cryptoFile = new File(uploadFile.getPath().substring(0, uploadFile.getPath().lastIndexOf(".")) + "crypto" + uploadFile.getPath().substring(uploadFile.getPath().lastIndexOf(".")));
//                // 执行加密
//                cryptoFile(uploadFile, cryptoFile);
//                // 保存加密后的文件
//                uploadFile = cryptoFile;
//            }
//            // 创建 Jersey 服务器
//            Client client = Client.create();
//            WebResource wr = client.resource(fullPath);
//            // 上传文件
//            wr.put(String.class, fileToByte(uploadFile));
//        } catch (Exception e) {
//            e.printStackTrace();
//            return null;
//        }
//        return fullPath;
//    }

//    public static String uploadAliyunOSS(File uploadFile, String isOriginalName, boolean isCrypto) {
//
//        String suffix = uploadFile.getName().substring(uploadFile.getName().lastIndexOf("."));
//        String randomFileName = isOriginalName == null ? SnowflakeIdUtils.getId() + suffix : isOriginalName + suffix;
//        try {
//            if (isCrypto) {
//                // 创建加密文件
//                File cryptoFile = new File(uploadFile.getPath().substring(0, uploadFile.getPath().lastIndexOf(".")) + "crypto" + uploadFile.getPath().substring(uploadFile.getPath().lastIndexOf(".")));
//                // 执行加密
//                cryptoFile(uploadFile, cryptoFile);
//                // 保存加密后的文件
//                uploadFile = cryptoFile;
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//            return null;
//        }

        // 创建OSSClient实例。
//        OSS ossClient = new OSSClientBuilder().build(CustomConstants.ALIYUN_OSS_ENDPOINT, CustomConstants.ALIYUN_OSS_ACCESS_KEY_ID, CustomConstants.ALIYUN_OSS_ACCESS_KEY_SECRET);

        // 创建PutObjectRequest对象。
//        PutObjectRequest putObjectRequest = new PutObjectRequest(CustomConstants.ALIYUN_OSS_BUCKET_NAME, randomFileName, uploadFile);

        // 上传文件。
//        ossClient.putObject(putObjectRequest);

        // 关闭OSSClient。
//        ossClient.shutdown();
//
//        String url = ossClient.generatePresignedUrl(CustomConstants.ALIYUN_OSS_BUCKET_NAME, randomFileName, CustomConstants.ALIYUN_OSS_EXPIRATION).toString();
//
//        return url;
//    }

    /**
     * 删除文件服务器上的文件
     *
     * @param url 文件路径
     * @return boolean
     */
//    public static boolean deleteByUrl(String url) {
//
//        try {
//            Client client = new Client();
//            WebResource webResource = client.resource(url);
//            webResource.delete();
//            return true;
//        } catch (Exception e) {
//            return false;
//        }
//    }

//    public static void deleteByAliyunOSS(String fileName) {
//
//        if (StringUtils.isNotBlank(fileName)) {
//            // 创建OSSClient实例。
//            OSS ossClient = new OSSClientBuilder().build(CustomConstants.ALIYUN_OSS_ENDPOINT, CustomConstants.ALIYUN_OSS_ACCESS_KEY_ID, CustomConstants.ALIYUN_OSS_ACCESS_KEY_SECRET);
//
//            ossClient.deleteObject(CustomConstants.ALIYUN_OSS_BUCKET_NAME, fileName);
//
//            // 关闭OSSClient。
//            ossClient.shutdown();
//        }
//    }

    /**
     * https://lavandehotels.oss-cn-beijing.aliyuncs.com/1bab63fa7ea94f42bef1dca951250de5.xlsx?Expires=1904292080&OSSAccessKeyId=LTAI4GC64Lo9Lm6c29BSL29j&Signature=Oj9%2Bmwrn0tYVIkmw%2FOfYLfMfsis%3D
     * File 转 Bytes
     *
     * @param file
     * @return byte[]
     */
    public static byte[] fileToByte(File file) {

        byte[] buffer = null;
        try {
            FileInputStream fileInputStream = new FileInputStream(file);
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            byte[] bytes = new byte[1024];
            int n;
            while ((n = fileInputStream.read(bytes)) != -1) {
                byteArrayOutputStream.write(bytes, 0, n);
            }
            fileInputStream.close();
            byteArrayOutputStream.close();
            buffer = byteArrayOutputStream.toByteArray();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return buffer;
    }

    /**
     * 创建 .txt 文件
     *
     * @param filePath 文件路径
     * @param fileName 文件名称
     * @param content  文件内容
     * @return boolean
     */
    public static File writerTxtFile(String filePath, String fileName, String content) {

        try {
            File file = new File(filePath + fileName + ".txt");
            if (!file.exists()) {
                file.createNewFile();
            }
            OutputStreamWriter write = new OutputStreamWriter(new FileOutputStream(file), "gbk");
            BufferedWriter writer = new BufferedWriter(write);
            writer.write(content);
            writer.close();
            return file;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取oss 路径
     *
     * @param fileName
     * @return
     */
//    public static String getOssUrl(String fileName) {
//        // 创建OSSClient实例。
//        OSS ossClient = new OSSClientBuilder().build(CustomConstants.ALIYUN_OSS_ENDPOINT, CustomConstants.ALIYUN_OSS_ACCESS_KEY_ID, CustomConstants.ALIYUN_OSS_ACCESS_KEY_SECRET);
//
//        String url = ossClient.generatePresignedUrl(CustomConstants.ALIYUN_OSS_BUCKET_NAME, fileName, CustomConstants.ALIYUN_OSS_EXPIRATION).toString();
//
//        url = "https" + url.substring(4);
//
//        return url;
//    }

    /**
     * 下载文件名重新编码
     *
     * @param request  请求对象
     * @param fileName 文件名
     * @return 编码后的文件名
     */
    public static String setFileDownloadHeader(HttpServletRequest request, String fileName) {
        final String agent = request.getHeader("USER-AGENT");
        String filename = fileName;
        try {
            if (agent.contains("MSIE")) {
                // IE浏览器
                filename = URLEncoder.encode(filename, UTF8);
                filename = filename.replace("+", " ");
            } else if (agent.contains("Firefox")) {
                // 火狐浏览器
                filename = new String(fileName.getBytes(), "ISO8859-1");
            } else if (agent.contains("Chrome")) {
                // google浏览器
                filename = URLEncoder.encode(filename, UTF8);
            } else {
                // 其它浏览器
                filename = URLEncoder.encode(filename, UTF8);
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return filename;
    }
}

