<?php

declare(strict_types=1);

namespace Kylin\Prompt\Traits;

/**
 * 提示语审计日志 Trait
 *
 * 依据等保 2.0 (GB/T 22239) 8.1.4.6：
 * 提示语修改操作需记录审计日志。
 *
 * 使用方式：
 *   class PromptManageService
 *   {
 *       use PromptAudit;
 *
 *       public function updatePrompt(int $promptId, array $data): void
 *       {
 *           // ... 业务逻辑 ...
 *
 *           $this->auditPrompt('prompt_updated', 'kp_prompts', $promptId, [
 *               'age_group' => $data['age_group'],
 *               'scene' => $data['scene'],
 *           ]);
 *       }
 *   }
 */
trait PromptAudit
{
    /**
     * 写入提示语审计日志
     */
    protected function auditPrompt(string $event, string $modelType, int|string $modelId, array $data = []): void
    {
        if (! class_exists(\Kylin\AuditLog\Models\AuditLog::class)) {
            return;
        }

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