package com.shanghaichengdi.ghjgitem.util;

import com.shanghaichengdi.ghjgitem.config.SnowflakeMakeConf;
import com.shanghaichengdi.ghjgitem.enums.OutsideInterface;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

@Slf4j
@Component
public class FileUtilString {

  public static final String newfile = "newfile";
  public static final String msg = "msg";
  ;
  public static final String oldfileName = "oldfileName";
  String ghjgFileLoad = OutsideInterface.GHJG_FILE_LOAD.getUrlString();
  String ghjgFileservice = OutsideInterface.GHJG_FILE_SERVICE.getUrlString();
  @Autowired
  SnowflakeMakeConf snowflakeMakeConf;

  /**
   * @param file
   * @param savePath
   * @return java.util.Map<java.lang.String, java.lang.Object> 文件上传接口的解析，保存。map结构中包含：msg，返回消息.
   * newfile，保存的文件(file).  oldfileName 旧的文件名
   * @Author oyq
   * @Date 2022/3/23 11:21
   **/
  public Map<String, Object> upLoadFiles(MultipartFile file, String savePath) {
    Map<String, Object> map = new HashMap<>();
    //设置支持最大上传的文件，这里是1024*1024*20=20M
    long MAX_SIZE = 20971520L;
    //获取要上传文件的名称
    String fileName = file.getOriginalFilename();
    //如果名称为空，返回一个文件名为空的错误
    if (!StringUtils.hasText(fileName)) {
      return map;
    }
    //如果文件超过最大值，返回超出可上传最大值的错误
    if (file.getSize() > MAX_SIZE) {
      return map;
    }
    //获取到后缀名
    String suffixName =
        fileName.contains(".") ? fileName.substring(fileName.lastIndexOf(".")) : null;
    //文件的保存重新按照雪花算法命名
    String newName = snowflakeMakeConf.snowflakeStringId() + suffixName;
    File newFile = new File(savePath, newName);
    if (!newFile.getParentFile().exists()) {
      newFile.getParentFile().mkdirs();
    }
    try {
      //文件写入
      file.transferTo(newFile);
    } catch (IOException e) {
      e.printStackTrace();
    }
    map.put(FileUtilString.newfile, newFile);
    map.put(FileUtilString.oldfileName, fileName);
    log.info(fileName + ",文件上传到" + newFile.getPath());
    return map;
  }

  /**
   * @return 返回 File 的去除头路径的path
   * @Author oyq
   * @Date 2022/8/22 14:27
   **/
  public String getFilePath(File file) {
    String path;
    path = file.getPath().replace("\\", "/").replace(ghjgFileLoad, "");
    return path;
  }

  /**
   * @return 当前环境的文件存储路径
   * @Author oyq
   * @Date 2022/8/29 10:57
   **/
  public String getDevFilePath() {
    String path;
    path = ghjgFileservice;
    if (ghjgFileLoad.contains("test/")) {
      path = path + "test/";
    }
    return path;
  }

  /**
   * @return 返回传入文件的网络发布路径，需要注意！传入的文件存放路径必须要被spring映射
   * @Author oyq
   * @Date 2022/8/29 10:51
   **/
  public String getFileUrl(File file) {
    return this.getDevFilePath() + this.getFilePath(file);
  }
}
