package com.jiayue.ipfcst.fileupload.util;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.springframework.util.ResourceUtils;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.nio.file.Files;
import java.nio.file.LinkOption;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributeView;
import java.nio.file.attribute.BasicFileAttributes;
import java.security.MessageDigest;
import java.util.Date;

/**
 * 文件工具类
 *
 * @author xsl
 * @version 3.0
 */
@Slf4j
public class FileUtil {
  /**
   * 移动本地文件
   *
   * @param remoteAbsoluteFile 远程文件名(包括完整路径)
   * @param localAbsoluteFile  本地文件名(包括完整路径)
   * @return 成功时，返回true，失败返回false
   * @throws Exception
   */
  public static void move(String localAbsoluteFile, String remoteAbsoluteFile) throws Exception {
    File srcFile = new File(localAbsoluteFile);
    File destDir = new File(remoteAbsoluteFile);
    try {
      if (!destDir.exists()) {// 如果目录不存在则创建目录
        boolean b = destDir.mkdirs();
        if (!b) // 如果创建失败则抛出异常
          throw new RuntimeException(destDir + " 目录创建失败");
      }
      FileUtils.moveFile(srcFile, new File(remoteAbsoluteFile + File.separator + srcFile.getName()));
    } catch (IOException e) {
      throw new Exception("文件：" + srcFile.getName() + "移动到" + destDir.getPath() + "失败。", e);
    }
  }

  //文件内容md5加密
  public static String getMD5(byte[] fileByte) {
    String md5 = new String();
    try {
      MessageDigest md = MessageDigest.getInstance("MD5");
      md.update(fileByte);
      byte b[] = md.digest();

      int i;

      StringBuffer buf = new StringBuffer("");
      for (int offset = 0; offset < b.length; offset++) {
        i = b[offset];
        if (i < 0)
          i += 256;
        if (i < 16)
          buf.append("0");
        buf.append(Integer.toHexString(i));
      }

      md5 = buf.toString();

    } catch (Exception e) {
      e.printStackTrace();
    }
    return md5;
  }

  /**
   * 获取文件创建时间
   *
   * @param fullFileName
   * @return
   */
  public static Long getFileCreateTime(String fullFileName) {
    Path path = Paths.get(fullFileName);
    BasicFileAttributeView basicview = Files.getFileAttributeView(path, BasicFileAttributeView.class, LinkOption.NOFOLLOW_LINKS);
    BasicFileAttributes attr;
    try {
      attr = basicview.readAttributes();
      Date createDate = new Date(attr.creationTime().toMillis());
      return createDate.getTime();
    } catch (Exception e) {
      e.printStackTrace();
    }
    return new Date().getTime();
  }

  /**
   * 获取项目根路径
   *
   * @return
   */
  public static String getResourceBasePath() {
    // 获取跟目录
    File path = null;
    try {
      path = new File(ResourceUtils.getURL("classpath:").getPath());

    } catch (FileNotFoundException e) {
      // nothing to do
    }
    if (path == null || !path.exists()) {
      path = new File("");
    }

    String pathStr = path.getAbsolutePath();
    try {
      pathStr = URLDecoder.decode(pathStr, "UTF-8");
    } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
    }
    // 如果是在eclipse中运行，则和target同级目录,如果是jar部署到服务器，则默认和jar包同级
//    pathStr = pathStr.replace("\\target\\classes", "");

    return pathStr;
  }

  /**
   * 获取上报文件目录相对路径
   *
   * @return
   */
  public static String getFileUploadPath() {
    return createUploadAllDir("uploadFile");
  }

  /**
   * 获取下载文件目录相对路径
   *
   * @return
   */
  public static String getDownloadFilePath() {
    return createUploadAllDir("downloadFile");
  }

  /**
   * 获取下载文件目录相对路径
   *
   * @return
   */
  public static String getZxglFilePath() {
    return createUploadAllDir("zxgl");
  }

  /**
   * 获取日志目录相对路径
   *
   * @return
   */
  public static String getLogsPath() {
    return createUploadAllDir("logs");
  }

  /**
   * 获取系统脚本相对路径
   *
   * @return
   */
  public static String getBinPath() {
    return createUploadAllDir("bin");
  }

  /**
   * 程序备份相对路径
   *
   * @return
   */
  public static String getOriginalPath() {
    return createUploadAllDir("original");
  }

  /**
   * 系统资料相对路径
   *
   * @return
   */
  public static String getSystemFilePath() {
    return createUploadAllDir("systemFile");
  }

  /**
   * 获取被删除文件目录
   *
   * @return 路径
   */
  public static String getDeleteFilePath() {
    return createUploadAllDir("deleteFile");
  }

  /**
   * 程序运行相对路径
   *
   * @return
   */
  public static String getProducePath() {
    return createUploadAllDir("produce");
  }

  /**
   * 报表相对路径
   *
   * @return
   */
  public static String getreportFormPath() {
    return createUploadAllDir("reportForm");
  }

  /**
   * 获取临时文件目录相对路径
   *
   * @return
   */
  public static String getTempFilePath() {
    return createUploadAllDir("tempFile");
  }

  public static String getE46Path() {
    return createUploadAllDir("HN");
  }

  private static String createUploadAllDir(String dir) {
    String path = "";
    if (System.getProperties().getProperty("file.separator").equals("\\")) {
      path = new File(getResourceBasePath()).getParentFile().getParentFile().getParentFile().getAbsolutePath() + File.separator + dir;
      try {
        path = URLDecoder.decode(path, "UTF-8");
      } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
      }
      File file = new File(path);
      if (!file.exists()) {
        boolean b = file.mkdirs();
        if (!b)
          log.error("目录创建失败" + path);
      }
    }
    else{
      path = "/home/syjy/ipfcstV3/"+ dir;
    }
    return path;
  }

  /**
   * 获取环境数据导出文件目录相对路径
   *
   * @return
   */
  public static String getEnvironmentalDataFile() {
    return createUploadAllDir("environmentalDataFile");
  }
}
