<?php

declare(strict_types=1);

namespace Kylin\ElderlyCare\Services;

use Illuminate\Support\Facades\Crypt;

/**
 * 健康数据加密服务
 *
 * 依据《个人信息保护法》第二十八条，健康数据属于敏感个人信息，
 * 存储时需加密处理。
 *
 * 使用方式：
 *   $encrypted = HealthDataEncryptor::encrypt(['heart_rate' => 72, 'blood_oxygen' => 98]);
 *   $original  = HealthDataEncryptor::decrypt($encrypted);
 */
final class HealthDataEncryptor
{
    /**
     * 加密健康数据
     *
     * @param array<string, mixed> $data 健康数据键值对
     * @return string JSON 加密字符串
     */
    public static function encrypt(array $data): string
    {
        return Crypt::encryptString(json_encode($data, JSON_UNESCAPED_UNICODE));
    }

    /**
     * 解密健康数据
     *
     * @param string $encrypted 加密字符串
     * @return array<string, mixed> 健康数据键值对
     */
    public static function decrypt(string $encrypted): array
    {
        try {
            return json_decode(Crypt::decryptString($encrypted), true, 512, JSON_THROW_ON_ERROR);
        } catch (\Throwable) {
            return [];
        }
    }

    /**
     * 脱敏健康数据用于日志记录
     *
     * 依据《个人信息保护法》第五十一条，日志中敏感信息需脱敏。
     *
     * @param array<string, mixed> $data 健康数据
     * @return array<string, mixed> 脱敏后的数据
     */
    public static function mask(array $data): array
    {
        // 健康数据本身不需要脱敏（用户 ID 和组织信息需脱敏），保留原始值
        $masked = $data;
        unset($masked['elderly_id'], $masked['elderly_name'], $masked['id_card']);

        return $masked;
    }
}