package com.hai.service.impl;

import com.hai.common.exception.ErrorCode;
import com.hai.common.exception.ErrorHelp;
import com.hai.common.exception.SysCode;
import com.hai.common.security.Base64Util;
import com.hai.service.FileUploadService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service(value = "fileUploadService")
public class FileUploadServiceImpl implements FileUploadService {

    @Override
    @Transactional
    public Map<String, String> upload(List<MultipartFile> files, Map<String, String> paramsMap) throws Exception {

        String pathPrefix = paramsMap.get("pathPrefix");    // 文件前缀
        String fileNameGenerator = paramsMap.get("fileNameGenerator");    // 文件名生成方式
        if (StringUtils.isBlank(pathPrefix)
                || StringUtils.isBlank(fileNameGenerator)) {
            throw ErrorHelp.genException(SysCode.System, ErrorCode.REQ_PARAMS_ERROR, "");
        }

        Map<String, String> result = new HashMap<>();
        for (MultipartFile file : files) {
            if (!file.isEmpty()) {
                String fileName = file.getOriginalFilename();    // 获取文件名
                fileName = generateFileName(fileName, paramsMap);    // 按照生成规则生成文件名
                result.put(file.getOriginalFilename(), fileName);

                File dest = new File(pathPrefix + File.separator + fileName);
                if (!dest.getParentFile().exists()) {
                    dest.getParentFile().mkdirs();
                }
                file.transferTo(dest);
            }
        }

        return result;
    }

    @Override
    public boolean deleteFile(String filePath) {
        boolean delete_flag = false;
        File file = new File(filePath);
        if (file.exists() && file.isFile() && file.delete())
            delete_flag = true;
        else
            delete_flag = false;
        return delete_flag;
    }

    /**
     * 根据不同规则生成文件名
     */
    private String generateFileName(String fileName, Map<String, String> paramsMap) throws Exception{

        /**
         * 获取文件名后缀
         * （1）如果指定后缀，用指定的后缀名称
         * （2）如果未指定后缀，且文件有后缀，用文件自己的后缀
         * （3）如果未指定后缀，且文件无后缀，则生成的文件也没有后缀
         */
        String pathSuffix = paramsMap.get("pathSuffix");
        if (StringUtils.isBlank(pathSuffix)) {
            if (fileName.lastIndexOf('.') != -1) {
                pathSuffix = fileName.substring(fileName.lastIndexOf('.'));
            } else {
                pathSuffix = "";
            }
        }
        // 文件名前缀
        String name = fileName.substring(0, fileName.lastIndexOf("."));

        // 生成文件名
        String result = null;
        if ("generateFileNameById".equals(paramsMap.get("fileNameGenerator"))) {
            // 对文件指定id进行Base64加密
            // todo 暂不使用，没有id
            if (StringUtils.isBlank(paramsMap.get(fileName))) {
                result = fileName;
            } else {
                result = Base64Util.encode(paramsMap.get(fileName)) + pathSuffix;
            }

        } else if ("generateFileNameByTimeStamp".equals(paramsMap.get("fileNameGenerator"))) {
            // 根据时间戳生成文件名

            result = String.valueOf(System.currentTimeMillis()) + pathSuffix;

        } else if ("generateFileNameByOriginalName".equals(paramsMap.get("fileNameGenerator"))) {
            // 按"原文件名"生成文件名

            result = fileName;

        }else if ("generateFileNameAndTimeStamp".equals(paramsMap.get("fileNameGenerator"))) {
            // 按"原文件名+时间戳"生成文件名

            result = name + String.valueOf(System.currentTimeMillis()) + pathSuffix;

        }

        String childPath = paramsMap.get("childPath");
        if (StringUtils.isBlank(childPath)) {
            childPath = "";
        }
        return childPath + result;
    }

}
