package com.shf.sso.client.utils;

import cn.hutool.core.date.DateUtil;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
import org.springframework.stereotype.Component;
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 javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.UUID;

/**
 * 描述:
 *
 * @Author shf
 * @Date 2019/4/25 18:18
 * @Version V1.0
 **/
@Component
public class CommonUtil {
    /**
     * 获取请求IP
     * @param request
     * @return
     */
    public static String getIP(HttpServletRequest request){
        String ip=request.getHeader("x-forwarded-for");
        if(ip==null || ip.length()==0 || "unknown".equalsIgnoreCase(ip)){
            ip=request.getHeader("Proxy-Client-IP");
        }
        if(ip==null || ip.length()==0 || "unknown".equalsIgnoreCase(ip)){
            ip=request.getHeader("WL-Proxy-Client-IP");
        }
        if(ip==null || ip.length()==0 || "unknown".equalsIgnoreCase(ip)){
            ip=request.getHeader("X-Real-IP");
        }
        if(ip==null || ip.length()==0 || "unknown".equalsIgnoreCase(ip)){
            ip=request.getRemoteAddr();
        }
        return ip;
    }
    public static String getUrl(HttpServletRequest request){
        return request.getRequestURL().toString();
    }
    /**
     * 返回UUID - code
     */
    public static String getUUID(){
        return UUID.randomUUID().toString().replaceAll("-", "");
    }
    public static String getUUID(Integer len){
        String uuid = UUID.randomUUID().toString().replaceAll("-", "");
        if(uuid.length() < len){
            return uuid;
        }
        return uuid.substring(0, len);
    }

    /**
     * 将String类型的时间转为java.util.Date
     * @param time
     * @return
     */
    public static Date parseDate(String time){
        return DateUtil.parse(time, "yyyy-MM-dd HH:mm:ss");
    }

    /**
     * 获取HttpServletRequest
     * @return
     */
    public static HttpServletRequest getRequest(){
        return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
    }

    /**
     * 获取HttpServletResponse
     * @return
     */
    public static HttpServletResponse getResponse(){
        return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
    }

    /**
     * 创建文件 - 如果路径不存在则创建路径
     * @param path
     * @param filename
     * @throws IOException
     */
    public static File createFile(String path, String filename) throws IOException {
        File file = new File(path + File.separator + filename);
        File fileParent = file.getParentFile();
        if(!fileParent.exists()){
            fileParent.mkdirs();
        }
        file.createNewFile();
        return file;
    }
    /**
     * 创建文件 - 如果路径不存在则创建路径
     * @param path
     * @throws IOException
     */
    public static File createFile(String path) throws IOException {
        File file = new File(path);
        File fileParent = file.getParentFile();
        if(!fileParent.exists()){
            fileParent.mkdirs();
        }
        file.createNewFile();
        return file;
    }
    /**
     * 因为在ie浏览器下,MultipartFile的getOriginalFilename()方法,返回的文件名包含了带盘符的路径,
     * 如果需要只获取原来的文件名,需要处理一下。
     * 在获取文件名后,判断是否在IE环境下运行的此方法,并做相应的字符串截取的处理,即可返回正确的结果。
     * @param file
     * @return
     */
    public static String getOriginalFileName(MultipartFile file){
        // 获取文件名
        String fileName = file.getOriginalFilename();
        //判断是否为IE浏览器的文件名,IE浏览器下文件名会带有盘符信息
        // Check for Unix-style path
        int unixSep = fileName.lastIndexOf('/');
        // Check for Windows-style path
        int winSep = fileName.lastIndexOf('\\');
        // Cut off at latest possible point
        int pos = (winSep > unixSep ? winSep : unixSep);
        if (pos != -1)  {
            // Any sort of path separator found...
            fileName = fileName.substring(pos + 1);
        }
        return fileName;
    }
    public static boolean matchers(String url, HttpServletRequest request) {
        AntPathRequestMatcher matcher = new AntPathRequestMatcher(url);
        if (matcher.matches(request)) {
            return true;
        }
        return false;
    }

}