package com.yifu.cloud.plus.v1.yifu.archives.util;

import lombok.extern.slf4j.Slf4j;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import static java.util.regex.Pattern.compile;

/**
 * 身份证处理
 * @Author fxj
 * @Date 2019-11-15
 * @return
 **/
@Slf4j
public class IdCardUtil {
    public static int IdNOToAge(String IdNO){
        int leh = IdNO.length();
        Date dates=null;
        SimpleDateFormat df = new SimpleDateFormat("yyyy");
        String year=df.format(new Date());
        dates = getBirthdate(IdNO);
        int u=Integer.parseInt(year)-Integer.parseInt(df.format(dates));
        return u;


    }

    /**
     * 提取身份证中的出生日期，身份证非法则返回空
     * @param idNum
     * @return
     */
    public static java.sql.Date getBirthdate(String idNum){
        Pattern idNumPattern = null;
        Matcher idNumMatcher = null;
		java.sql.Date date = null;
        //定义判别用户身份证号的正则表达式（要么是15位，要么是18位，最后一位可以为字母）
        idNumPattern = compile("(\\d{14}[0-9a-zA-Z])|(\\d{17}[0-9a-zA-Z])");
        //通过Pattern获得Matcher
        idNumMatcher = idNumPattern.matcher(idNum);
        //判断用户输入是否为身份证号
        if(idNumMatcher.matches()){
            Pattern birthDatePattern =null;
            Matcher birthDateMather = null;
            String year = null;
            if(idNum.length()==18){
                //如果是，定义正则表达式提取出身份证中的出生日期
                birthDatePattern= compile("\\d{6}(\\d{4})(\\d{2})(\\d{2}).*");//身份证上的前6位以及出生年月日
                //通过Pattern获得Matcher
                birthDateMather= birthDatePattern.matcher(idNum);
            }else if(idNum.length()==15){
                //如果是，定义正则表达式提取出身份证中的出生日期
                birthDatePattern= compile("\\d{6}(\\d{2})(\\d{2})(\\d{2}).*");//身份证上的前6位以及出生年月日
                //通过Pattern获得Matcher
                birthDateMather= birthDatePattern.matcher(idNum);
            }
            //通过Matcher获得用户的出生年月日
            if(null != birthDateMather &&  birthDateMather.find()){
                if(idNum.length()==18){
                    year = birthDateMather.group(1);
                }else if(idNum.length()==15){
                    year = "19"+birthDateMather.group(1);
                }
                String month = birthDateMather.group(2);
                String datetemp = birthDateMather.group(3);
                String dateStr =year+"-"+month+"-"+datetemp;
                SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd" );
				Date shijian = null;
                try {
                    shijian =sdf.parse(dateStr);
                    String temp = sdf.format(shijian);
                    if(dateStr.equals(temp)){
                        //输出用户的出生年月日
                        date = new java.sql.Date(shijian.getTime());
                    }
                } catch (ParseException e) {
                    //数据有误
                }

            }
        }
        return date;
    }

	/**
     * 提取身份证中的出生日期，身份证非法则返回空
     * @param idNum
     * @return
     */
    public static String getBirthdateByPatten(String idNum, String patten){
        Pattern idNumPattern = null;
        Matcher idNumMatcher = null;
		String returnDateStr = null;
        //定义判别用户身份证号的正则表达式（要么是15位，要么是18位，最后一位可以为字母）
        idNumPattern = compile("(\\d{14}[0-9a-zA-Z])|(\\d{17}[0-9a-zA-Z])");
        //通过Pattern获得Matcher
        idNumMatcher = idNumPattern.matcher(idNum);
        //判断用户输入是否为身份证号
        if(idNumMatcher.matches()){
            Pattern birthDatePattern =null;
            Matcher birthDateMather = null;
            String year = null;
            if(idNum.length()==18){
                //如果是，定义正则表达式提取出身份证中的出生日期
                birthDatePattern= compile("\\d{6}(\\d{4})(\\d{2})(\\d{2}).*");//身份证上的前6位以及出生年月日
                //通过Pattern获得Matcher
                birthDateMather= birthDatePattern.matcher(idNum);
            }else if(idNum.length()==15){
                //如果是，定义正则表达式提取出身份证中的出生日期
                birthDatePattern= compile("\\d{6}(\\d{2})(\\d{2})(\\d{2}).*");//身份证上的前6位以及出生年月日
                //通过Pattern获得Matcher
                birthDateMather= birthDatePattern.matcher(idNum);
            }
            //通过Matcher获得用户的出生年月日
            if(null != birthDateMather &&  birthDateMather.find()){
                if(idNum.length()==18){
                    year = birthDateMather.group(1);
                }else if(idNum.length()==15){
                    year = "19"+birthDateMather.group(1);
                }
                String month = birthDateMather.group(2);
                String datetemp = birthDateMather.group(3);
                String dateStr =year+"-"+month+"-"+datetemp;
				SimpleDateFormat sdfInput = new SimpleDateFormat("yyyy-MM-dd");
                SimpleDateFormat sdfOut = new SimpleDateFormat( patten );
                try {
					Date shijian =sdfInput.parse(dateStr);
					returnDateStr = sdfOut.format(shijian);
                } catch (ParseException e) {
                    //数据有误
                }

            }
        }
        return returnDateStr;
    }
    /**
     * 获取身份证的性别
     * @Author fxj
     * @Date 2019-12-25
     * @param idNum
     * @return
     **/
    public static String getSex(String idNum){
        Pattern idNumPattern = null;
        Matcher idNumMatcher = null;
        Date date = null;
        //定义判别用户身份证号的正则表达式（要么是15位，要么是18位，最后一位可以为字母）
        idNumPattern = compile("(\\d{14}[0-9a-zA-Z])|(\\d{17}[0-9a-zA-Z])");
        //通过Pattern获得Matcher
        idNumMatcher = idNumPattern.matcher(idNum);
        //判断用户输入是否为身份证号
        String sex = null;
        if(idNumMatcher.matches()) {
            if (idNum.length() == 18) {
                if (Integer.parseInt(idNum.substring(16).substring(0, 1)) % 2 == 0) {// 判断性别
                    sex = "2";
                } else {
                    sex = "1";
                }
            } else if (idNum.length() == 15) {
                if (Integer.parseInt(idNum.substring(14, 15)) % 2 == 0) {
                    sex = "2";
                } else {
                    sex = "1";
                }
            }
        }
        return sex;
    }

	/**
	 * 获取性别名称
	 * @param idNum
	 * @return
	 */
	public static String getSexName(String idNum) {
		String sex = "男";
		if (idNum != null) {
			String sexString = "";
			if (idNum.length() == 18) {
				sexString = idNum.substring(16, 17);
			} else if (idNum.length() == 15) {
				sexString = idNum.substring(14, 15);
			}
			try {
				// 判断性别
				if (Integer.parseInt(sexString) % 2 == 0) {
					sex = "女";
				}
			} catch (Exception e) {
				sex = "男";
			}
		}
		return sex;
	}

}
