<?php

declare(strict_types=1);

namespace Kylin\ElderlyCare\Services;

/**
 * 数据保留策略
 *
 * 依据《个人信息保护法》第四十七条，处理目的已实现或保存期限届满时应删除个人信息。
 * 依据 GB/T 35796-2017 养老机构服务质量基本规范，离院老人健康档案至少保留 15 年。
 *
 * 使用方式：
 *   $retention = DataRetentionPolicy::getRetentionDays('health_record');
 *   $shouldDelete = DataRetentionPolicy::shouldClean('health_record', $createdAt);
 */
final class DataRetentionPolicy
{
    /**
     * 各数据类型的保留策略（天）
     *
     * 依据：
     *  - 健康档案：GB/T 35796-2017，离院后保留 >= 15 年（5475 天）
     *  - 护理记录：医疗行业通用，保留 >= 10 年（3650 天）
     *  - 设备监控数据：数据量大，保留 1 年（365 天）
     *  - 用药记录：医疗行业通用，保留 >= 5 年（1825 天）
     *  - 评估记录：GB/T 42195，保留 >= 15 年（5475 天）
     *  - 紧急呼叫记录：安全事件，保留 >= 3 年（1095 天）
     */
    private const RETENTION_POLICY = [
        'health_record' => 5475,   // 15 年
        'nursing_record' => 3650,  // 10 年
        'device_monitor' => 365,   // 1 年
        'medication_record' => 1825, // 5 年
        'assessment_record' => 5475, // 15 年
        'emergency_record' => 1095, // 3 年
    ];

    /**
     * 获取指定数据类型的保留天数
     *
     * @param string $type 数据类型（health_record/nursing_record/device_monitor/medication_record/assessment_record/emergency_record）
     * @return int 保留天数，默认 365 天
     */
    public static function getRetentionDays(string $type): int
    {
        return self::RETENTION_POLICY[$type] ?? 365;
    }

    /**
     * 判断数据是否应清理
     *
     * @param string $type      数据类型
     * @param string $createdAt 数据创建时间
     * @return bool true 表示应清理
     */
    public static function shouldClean(string $type, string $createdAt): bool
    {
        $retentionDays = self::getRetentionDays($type);
        $expireDate = now()->subDays($retentionDays);

        return \Carbon\Carbon::parse($createdAt)->lt($expireDate);
    }

    /**
     * 获取所有保留策略
     *
     * @return array<string, int>
     */
    public static function all(): array
    {
        return self::RETENTION_POLICY;
    }

    /**
     * 获取保留策略的中文说明
     *
     * @return array<string, array{label: string, days: int, law: string}>
     */
    public static function descriptions(): array
    {
        return [
            'health_record' => [
                'label' => '健康档案',
                'days' => 5475,
                'law' => 'GB/T 35796-2017，离院后保留 >= 15 年',
            ],
            'nursing_record' => [
                'label' => '护理记录',
                'days' => 3650,
                'law' => '医疗行业通用，保留 >= 10 年',
            ],
            'device_monitor' => [
                'label' => '设备监控数据',
                'days' => 365,
                'law' => '数据量大，保留 1 年',
            ],
            'medication_record' => [
                'label' => '用药记录',
                'days' => 1825,
                'law' => '医疗行业通用，保留 >= 5 年',
            ],
            'assessment_record' => [
                'label' => '评估记录',
                'days' => 5475,
                'law' => 'GB/T 42195，保留 >= 15 年',
            ],
            'emergency_record' => [
                'label' => '紧急呼叫记录',
                'days' => 1095,
                'law' => '安全事件，保留 >= 3 年',
            ],
        ];
    }
}