<?php

namespace Kylin\Community\Traits;

use Illuminate\Support\Facades\Crypt;

/**
 * 敏感字段加密 Trait
 * 符合 GB/T 35273-2020 个人信息保护规范
 * 身份证号、手机号等敏感字段 AES-256 加密存储
 */
trait Encryptable
{
    /**
     * 获取需要加密的字段
     */
    public function getEncryptableFields(): array
    {
        return $this->encryptable ?? [];
    }

    /**
     * 获取加密后的属性值
     */
    public function getAttributeValue($key)
    {
        $value = parent::getAttributeValue($key);

        if (in_array($key, $this->getEncryptableFields()) && $value !== null) {
            try {
                return Crypt::decryptString($value);
            } catch (\Exception) {
                return $value;
            }
        }

        return $value;
    }

    /**
     * 设置加密属性值
     */
    public function setAttribute($key, $value)
    {
        if (in_array($key, $this->getEncryptableFields()) && $value !== null) {
            $value = Crypt::encryptString($value);
        }

        return parent::setAttribute($key, $value);
    }
}
