<?php
namespace App\Lib;
use DateTime;

class Tools{
    //根据当前日期和身份证获取年龄
    public static function calculateAgeFromID($idNumber, $targetDate) {
        // 检查身份证号码是否有效
        if (!preg_match("/^(\d{15}$|^\d{17}[xX\d]$)/", $idNumber)) {
            return 0;
        }
        // 提取出生年月日
        $birthYear = substr($idNumber, 6, 4);
        $birthMonth = substr($idNumber, 10, 2);
        $birthDay = substr($idNumber, 12, 2);

        // 创建出生日期和目标日期的 DateTime 对象
        $birthdate = new DateTime("$birthYear-$birthMonth-$birthDay");
        $target = new DateTime($targetDate);

        // 计算年龄
        $interval = $birthdate->diff($target);

        // 使用正确的属性获取年龄
        $age = $interval->y;

        return $age;
    }
//根据身份证获取生日
    public static function getBirthdayFromIDCard($idCard) {
        // 检查身份证号码是否有效
        if (!preg_match("/^(\d{15}$|^\d{17}[xX\d]$)/", $idCard)) {
            return false;
        }

        // 提取出生日期部分
        $birthday = substr($idCard, 6, 8);

        // 如果是15位的身份证号码，需要将年份从两位扩展到四位（假设1900-2000）
        if (strlen($idCard) == 15) {
            $year = substr($birthday, 0, 2);
            if ($year >= 0 && $year <= 20) { // 2000-2020
                $birthday = '20' . $birthday;
            } else { // 1900-1999
                $birthday = '19' . $birthday;
            }
        }

        // 格式化并返回日期字符串
        return date('Y-m-d', strtotime($birthday));
    }
    //根据身份证判断性别
    public static function getGenderFromIDCard($idCard) {
        // 检查身份证号是否合法（长度应该是18）
        if (strlen($idCard) != 18) {
            return null;
        }
        // 获取身份证号的第17位
        $genderBit = intval($idCard[16]);
        // 判断性别
        if ($genderBit % 2 == 0) {
            return 0;
        } else {
            return 1;
        }
    }
    //AES加密
    public  static function AESEncrypt($data, $key,$iv){
        // 使用openssl_encrypt进行加密
        $encryptedData = openssl_encrypt(
            $data,
            'AES-256-CBC',
            $key,
            OPENSSL_RAW_DATA,
            $iv
        );
        // 返回包含IV的加密数据，通常会将IV放在加密数据之前
        return base64_encode( $encryptedData);
    }
    //AES解密
    public  static function AESDecrypt($data, $key,$iv){
        // 解码base64编码的数据
        $data = base64_decode($data);
        $encryptedData = $data;
        // 使用openssl_decrypt进行解密
        return openssl_decrypt(
            $encryptedData,
            'AES-256-CBC',
            $key,
            OPENSSL_RAW_DATA,
            $iv
        );
    }
}
