package com.xkrs.utils;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static com.xkrs.utils.DateTimeUtil.getNowTimeStr;

public class FileUtil {
    private static final Logger log = LoggerFactory.getLogger(FileUtil.class);

    /**
     * 判断目录是否存在， 不存在创建
     * @param path 路径，目录最后带 File.separator
     * @return
     */
    public static boolean isFileExit(String path){
        path = path.replace("/",File.separator);
        File file = new File(path);
        if (file.exists()) {
            log.info("文件已存在");
            return true;
        }
        if(path.endsWith(File.separator)) {
            log.info("创建单个文件" + path + "失败，目标不能是目录！");
            return false;
        }
        if(!file.getParentFile().exists()) {
            log.info("目标文件所在路径不存在，准备创建。。。");
            if (file.getParentFile().mkdirs()) {
                if (file.mkdir()) {
                    log.info("创建目录文件成功！");
                }
            }
        } else {
            log.info("目标文件所在路径存在");
            if (file.mkdir()) {
                log.info("创建目录文件成功！");
            }
        }
        return true;
    }

    /**
     * 获取目录下的所有文件
     * @param filePath 目录
     * @return
     * @throws Exception
     */
    public static List<String> showListFile(String filePath) {
        File dir = new File(filePath);
        List<String> list = new ArrayList<>();
        // 查找参数文件是否存在,只检查第一个入参
        if(!dir.exists()) {
            log.error("找不到文件");
        }
        // 如果是目录那么进行递归调用
        if(dir.isDirectory()) {
            // 获取目录下的所有文件
            File[] f = dir.listFiles();
            // 进行递归调用,最后总会返回一个list
            assert f != null;
            for (File file : f) {
                list.addAll(showListFile(file.getPath()));
            }
        }else {
            // 不是目录直接添加进去,判断是否为xml文件
            list.add(dir.getPath());
        }
        return list;
    }

    /**
     * 移动文件到目标目录
     * @param path 文件路径
     * @return
     */
    /*public static FileEntity mvFile(String path){
        String savePath = "D:" + File.separator + "dms" + File.separator + "data" ;

        File file = new File(path);
        if (!file.isFile()) {
            log.info("{}不是文件。",path);
            return null;
        }
        // 从文件名获取到入库信息  暂时不知道
        String[] infos = path.split("/");
        String fileNameUnHandler = infos[infos.length - 1];
        String[] fileNameUnHandlerSplitWithPoint = fileNameUnHandler.split(".");
        String fileName = fileNameUnHandlerSplitWithPoint[0];
        String scene = fileNameUnHandlerSplitWithPoint[1];
        String[] fileNames = fileNameUnHandler.split("_");
        long length = file.length();
        String filePath = File.separator + scene + File.separator + fileName;
//        savePath = savePath + File.separator + dir + File.separator + fileName;
        if (isFileExit(savePath + File.separator + scene)) {
            if (file.renameTo(new File(filePath))) {
                log.info("移动文件{}到{}目录",file.getName(), savePath + filePath);
            } else {
                log.info("文件{}移动失败",file.getName());
                return null;
            }
        }
        return null;
    }*/

    /**
     * 读取txt文件内容
     * @param file
     * @return
     */
    public static String txt2String(File file){
        StringBuilder result = new StringBuilder();
        try{
            //构造一个BufferedReader类来读取文件
            BufferedReader br = new BufferedReader(new FileReader(file));
            String s = null;
            //使用readLine方法，一次读一行
            while((s = br.readLine())!=null){
                result.append(System.lineSeparator()).append(s);
            }
            br.close();
        }catch(Exception e){
            e.printStackTrace();
        }
        return result.toString();
    }

    /**
     * 确定上传文件路径遥感数据  栅格
     * @param file 文件
     * @return
     */
    public static String fileRsSaveType(File file) {
        String name = file.getName();
        String suffix = name.substring(name.indexOf("."));
        // 判断是否为栅格数据
        if (!suffix.contains("tif")) {
            return null;
        }
        // GF1_PMS1_E116.8_N36.6_20190528_L1A0004026837-MSS1_ORTHO_MS.tif
        String[] s = name.split("_");
        // 卫星种类
        String satelliteType = s[0];
        // 传感器种类
        String sensorType = s[1];
        // 中心点经度
        String lat = s[2];
        // 中心点纬度
        String lon = s[3];
        // 时间
        String time = s[4];
        String year = time.substring(0, 4);
        String month = time.substring(4, 6);
        String day = time.substring(6);
        // 产品号
        String product = s[5];
        String productLevel = product.substring(0, 3);
        String productCode = product.substring(3);
        // 种类
        String type = s[6];
        // 文件路径
        String filePath = "/" + satelliteType + "/" +  sensorType + "/" + productLevel + "/" + year + "/" + month + "/"
                + day + "/" + productCode + "/";

        return filePath;
    }

    /**
     * 矢量数据路径
     * C:\Users\dong\Desktop\2018年山东省矢量数据\2018年山东省矢量数据\2018年动态\分县动态\山东.gdb\sa.gdb
     * @param file
     * @return
     */
    public static String fileShpSavePath(File file) {
        if (file.exists()) {
            if (file.isFile()) {
                String path = file.getPath();
                String[] dirNames = path.split("\\\\");
                StringBuffer sb = new StringBuffer();
                int length = dirNames.length;
                final int  minLength = 5;
                if (length >= minLength) {
                    for (int i = 5; i > 1; i--) {
                        sb.append("/").append(dirNames[length - i]);
                    }
                    return sb.toString();
                }
            }
        }
        return null;
    }

    public static Map<String, String> getUploadInfo(String info) {
        final String statusFail = "fail";
        final String status = "status";
        ObjectMapper mapper = new ObjectMapper();
        JsonNode resultNode = null;
        Map<String, String> map = new HashMap<>();
        try {
            resultNode = mapper.readTree(info);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        if (!statusFail.equals(resultNode.path(status).asText())) {
            String path = resultNode.path("path").asText();
            String fileName = path.substring(path.lastIndexOf("/") + 1);
            map.put("md5", resultNode.path("md5").asText());
            map.put("mtime", getNowTimeStr());
            map.put("path", path);
            map.put("scene", resultNode.path("scene").asText());
            map.put("size", resultNode.path("size").asText());
            map.put("url", resultNode.path("url").asText());
            map.put("fileName", fileName);
        }
        return map;
    }

    public static boolean checkFileSize(Long len, int size, String unit) {
        double fileSize = 0;
        if ("B".equals(unit.toUpperCase())) {
            fileSize = (double) len;
        } else if ("K".equals(unit.toUpperCase())) {
            fileSize = (double) len / 1024;
        } else if ("M".equals(unit.toUpperCase())) {
            fileSize = (double) len / 1048576;
        } else if ("G".equals(unit.toUpperCase())) {
            fileSize = (double) len / 1073741824;
        }
        if (fileSize > size) {
            return false;
        }
        return true;
    }

    public static void main(String[] args) {
        String s = "C:/Users/dong/Desktop/2018年山东省矢量数据/2018年山东省矢量数据/2018年动态/分县动态/山东.gdb/a0000000a.gdbindexes";
        fileShpSavePath(new File(s));
    }
}
