<?php

declare(strict_types=1);

namespace Kylin\ElderlyCare\Traits;

/**
 * 养老业务审计日志 Trait
 *
 * 提供养老业务操作审计日志记录能力。
 * 在业务层 Service 中 use 此 trait 即可记录审计日志。
 *
 * 依据等保 2.0 (GB/T 22239) 8.1.4.6：
 * 评估和护理操作需记录审计日志。
 *
 * 使用方式：
 *   class NursingService
 *   {
 *       use ElderlyCareAudit;
 *
 *       public function assignCarePlan(Elderly $elderly, CarePlan $plan): void
 *       {
 *           // ... 业务逻辑 ...
 *
 *           $this->auditCare('nursing_assigned', 'elderly', $elderly->id, [
 *               'elderly_name' => $elderly->name,
 *               'plan_name' => $plan->name,
 *           ]);
 *       }
 *   }
 */
trait ElderlyCareAudit
{
    /**
     * 写入养老业务审计日志
     *
     * @param string $event     事件名（如 nursing_assigned, assessment_completed, health_data_uploaded）
     * @param string $modelType 模型类型（如 elderly, care_plan, health_record）
     * @param int|string $modelId 模型 ID
     * @param array<string, mixed> $data 审计数据（自动脱敏 elderly_id, elderly_name, id_card）
     */
    protected function auditCare(string $event, string $modelType, int|string $modelId, array $data = []): void
    {
        if (! class_exists(\Kylin\AuditLog\Models\AuditLog::class)) {
            return;
        }

        // 脱敏敏感字段
        $masked = $data;
        unset($masked['elderly_id'], $masked['elderly_name'], $masked['id_card'], $masked['phone']);

        try {
            \Kylin\AuditLog\Models\AuditLog::create([
                'event' => $event,
                'model_type' => $modelType,
                'model_id' => $modelId,
                'new_values' => $masked,
                'user_id' => auth()->id(),
                'ip' => request()->ip(),
                'url' => request()->fullUrl(),
                'tag' => 'elderly-care',
            ]);
        } catch (\Throwable $e) {
            logger()->warning('养老业务审计日志写入失败', [
                'event' => $event,
                'model_type' => $modelType,
                'model_id' => $modelId,
                'error' => $e->getMessage(),
            ]);
        }
    }
}