package com.rymcu.vertical.util;

import com.github.pagehelper.PageInfo;
import com.rymcu.vertical.dto.ArticleDTO;
import com.rymcu.vertical.dto.NotificationDTO;
import com.rymcu.vertical.entity.Notification;
import com.rymcu.vertical.entity.User;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.session.InvalidSessionException;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.springframework.core.env.Environment;

import javax.servlet.http.HttpServletRequest;
import java.time.*;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @author ronger
 */
public class Utils {
    public static final String HASH_ALGORITHM = "SHA-1";
    public static final String UNKOWN = "unknown";
    public static final int HASH_INTERATIONS = 1024;
    public static final int SALT_SIZE = 8;

    private static Environment env = SpringContextHolder.getBean(Environment.class);

    /**
     * 生成安全的密码,生成随机的16位salt并经过1024次 sha-1 hash
     */
    public static String entryptPassword(String plainPassword) {
        String plain = Encodes.unescapeHtml(plainPassword);
        byte[] salt = Digests.generateSalt(SALT_SIZE);
        byte[] hashPassword = Digests.sha1(plain.getBytes(), salt, HASH_INTERATIONS);
        return Encodes.encodeHex(salt)+Encodes.encodeHex(hashPassword);
    }

    /**
     *一般检查工具密码比对  add by xlf 2018-11-8
     * @param pwd
     * @param enpwd    加密的密码
     * @return
     */
    public static boolean comparePwd(String pwd,String enpwd){
        byte[] salt = Encodes.decodeHex(enpwd.substring(0,16));
        byte[] hashPassword = Digests.sha1(pwd.getBytes(), salt, HASH_INTERATIONS);
        return enpwd.equals(Encodes.encodeHex(salt)+Encodes.encodeHex(hashPassword));
    }

    public static User getCurrentUser() {
        return null;
    }

    public static Session getSession() {
        try{
            Subject subject = SecurityUtils.getSubject();
            Session session = subject.getSession(false);
            if (session == null){
                session = subject.getSession();
            }
            if (session != null){
                return session;
            }
            subject.logout();
        }catch (InvalidSessionException e){

        }
        return null;
    }

    public static Integer genCode() {
        Integer code = (int)((Math.random()*9+1)*100000);
        return code;
    }

    /**
     * 获取配置文件内属性
     * @param key 键值
     * @return 属性值
     * */
    public static String getProperty(String key){
        return env.getProperty(key);
    }

    public static String getTimeAgo(Date date) {

        String timeAgo;

        Instant instant = date.toInstant();
        ZoneId zone = ZoneId.systemDefault();
        LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
        LocalDate oldLocalDate = localDateTime.toLocalDate();

        LocalDate today = LocalDate.now();

        Period p = Period.between(oldLocalDate, today);
        if(p.getYears() > 0){
            timeAgo = p.getYears()+" 年前 ";
        }else if(p.getMonths() > 0){
            timeAgo = p.getMonths()+" 月前 ";
        }else if(p.getDays() > 0){
            timeAgo = p.getDays()+" 天前 ";
        }else {
            long to = System.currentTimeMillis();
            long from = date.getTime();
            int hours = (int) ((to - from)/(1000 * 60 * 60));
            if(hours > 0){
                timeAgo = hours+" 小时前 ";
            }else {
                int minutes = (int) ((to - from)/(1000 * 60));
                if(minutes == 0){
                    timeAgo = " 刚刚 ";
                }else {
                    timeAgo = minutes+" 分钟前 ";
                }
            }
        }
        return timeAgo;
    }

    public static Map getPagination(PageInfo pageInfo) {
        Map pagination = new HashMap(3);
        pagination.put("pageSize",pageInfo.getPageSize());
        pagination.put("total",pageInfo.getTotal());
        pagination.put("currentPage",pageInfo.getPageNum());
        return pagination;
    }

    public static void main(String[] args){
        LocalDate localDate = LocalDate.parse("2019-11-15");
        ZoneId zone = ZoneId.systemDefault();
        Instant instant = localDate.atStartOfDay().atZone(zone).toInstant();
        String s = getTimeAgo(Date.from(instant));
        System.out.println(s);
    }

    public static Map getArticlesGlobalResult(PageInfo<ArticleDTO> pageInfo) {
        Map map = new HashMap(2);
        map.put("articles", pageInfo.getList());
        Map pagination = new HashMap(4);
        pagination.put("pageSize",pageInfo.getPageSize());
        pagination.put("total",pageInfo.getTotal());
        pagination.put("currentPage",pageInfo.getPageNum());
        map.put("pagination", pagination);
        return map;
    }

    public static Map getNotificationsGlobalResult(PageInfo<Notification> pageInfo) {
        Map map = new HashMap(2);
        map.put("notifications", pageInfo.getList());
        Map pagination = new HashMap(4);
        pagination.put("pageSize",pageInfo.getPageSize());
        pagination.put("total",pageInfo.getTotal());
        pagination.put("currentPage",pageInfo.getPageNum());
        map.put("pagination", pagination);
        return map;
    }

    public static String getIpAddress(HttpServletRequest request) {
        String ip = request.getHeader("x-forwarded-for");
        if (ip == null || ip.length() == 0 || UNKOWN.equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || UNKOWN.equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || UNKOWN.equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_CLIENT_IP");
        }
        if (ip == null || ip.length() == 0 || UNKOWN.equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
        }
        if (ip == null || ip.length() == 0 || UNKOWN.equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        // 如果是多级代理,那么取第一个ip为客户端ip
        if (ip != null && ip.indexOf(",") != -1) {
            ip = ip.substring(0, ip.indexOf(",")).trim();
        }

        return ip;
    }

    public static Map getNotificationDTOsGlobalResult(PageInfo<NotificationDTO> pageInfo) {
        Map map = new HashMap(2);
        map.put("notifications", pageInfo.getList());
        Map pagination = new HashMap(4);
        pagination.put("pageSize",pageInfo.getPageSize());
        pagination.put("total",pageInfo.getTotal());
        pagination.put("currentPage",pageInfo.getPageNum());
        map.put("pagination", pagination);
        return map;
    }
}