<?php

declare(strict_types=1);

namespace Kylin\Dictionary\Traits;

/**
 * 字典操作审计日志 Trait
 *
 * 依据等保 2.0 (GB/T 22239) 8.1.4.6：
 * 字典增删改操作需记录审计日志。
 *
 * 使用方式：
 *   class DictionaryService
 *   {
 *       use DictAudit;
 *
 *       public function createType(...): DictType
 *       {
 *           $type = DictType::create(...);
 *           $this->auditDict('dict_type_created', $type->id, $type->toArray());
 *           return $type;
 *       }
 *   }
 */
trait DictAudit
{
    /**
     * 写入字典审计日志
     *
     * @param string $event 事件名
     * @param int|string $modelId 模型 ID
     * @param array $data 审计数据
     */
    protected function auditDict(string $event, 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' => 'dictionary',
                'model_id' => $modelId,
                'new_values' => $data,
                'user_id' => auth()->id(),
                'ip' => request()->ip(),
                'url' => request()->fullUrl(),
                'tag' => 'dictionary',
            ]);
        } catch (\Throwable $e) {
            logger()->warning('字典操作审计日志写入失败', [
                'event' => $event,
                'error' => $e->getMessage(),
            ]);
        }
    }
}