import { StringUtils } from "./StringUtils";

export class IdCardNumUtils {
  /**
   * 验证身份证号
   * @param idCardNum   身份证号
   * @returns           true   or   false
   */
  public static validateIdCardNum(idCardNum: string): boolean {
    if (idCardNum == null) {
      return false;
    }
    let idCardNumS = idCardNum.trim();
    if (idCardNumS.length != 18) {
      return false;
    }
    if (!IdCardNumUtils.checkCode(idCardNumS)) {
      return false
    }
    const date = idCardNumS.substring(6, 14)
    if (!IdCardNumUtils.checkDate(date)) {
      return false
    }
    if (IdCardNumUtils.checkProv(idCardNumS.substring(0, 2))) {
      return true
    }

    return false;
  }

  /**
   * 数字验证
   *
   * @param val 需要验证的字符串
   */
  public static isNum(val: string): boolean {
    const reg = new RegExp('^[0-9]*$');
    return val != null && "" != (val) && reg.test(val);
  }

  // 省份
  public static checkProv(val: string) {
    const pattern = /^[1-9][0-9]/
    const provs: Record<number, string> = {
      11: '北京',
      12: '天津',
      13: '河北',
      14: '山西',
      15: '内蒙古',
      21: '辽宁',
      22: '吉林',
      23: '黑龙江 ',
      31: '上海',
      32: '江苏',
      33: '浙江',
      34: '安徽',
      35: '福建',
      36: '江西',
      37: '山东',
      41: '河南',
      42: '湖北 ',
      43: '湖南',
      44: '广东',
      45: '广西',
      46: '海南',
      50: '重庆',
      51: '四川',
      52: '贵州',
      53: '云南',
      54: '西藏 ',
      61: '陕西',
      62: '甘肃',
      63: '青海',
      64: '宁夏',
      65: '新疆',
      71: '台湾',
      81: '香港',
      82: '澳门'
    }
    if (pattern.test(val)) {
      if (provs[val]) {
        return true
      }
    }
    return false
  }

  // 出生日期
  private static checkDate(val: string) {
    const pattern =
      /^(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)$/
    if (pattern.test(val)) {
      const year = val.substring(0, 4)
      const month = val.substring(4, 6)
      const date = val.substring(6, 8)
      const date2 = new Date(year + '-' + month + '-' + date)
      if (date2 && date2.getMonth() === parseInt(month) - 1) {
        return true
      }
    }
    return false
  }

  // 校验码校验
  private static checkCode(val: string) {
    const p =
      /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/
    const factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
    const parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2]
    const code = val.substring(17)
    if (p.test(val)) {
      let sum = 0
      for (let i = 0; i < 17; i++) {
        sum += Number(val.charAt(i)) * factor[i]
      }
      if (parity[sum % 11].toString() === code.toUpperCase()) {
        return true
      }
    }
    return false
  }



  public static isCarNumberNO(carNumber: string): boolean {
    if (StringUtils.isNullOrEmpty(carNumber)) {
      return false;
    }
    //两车同用
    const carTreg =
      /^([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[a-zA-Z](([ADF]((?![IO])[a-zA-Z0-9](?![IO]))[0-9]{4})|([0-9]{5}[ADF]))|[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1})$/
    return carTreg.test(carNumber);
  }

  //简称
  public static isJc(cph: string): boolean {
    if (StringUtils.isNullOrEmpty(cph)) {
      return false;
    }
    const ss = /^[A-Z]$/;
    return ss.test(cph);
  }
}