<?php

declare(strict_types=1);

namespace Kylin\Export\Traits;

/**
 * 导出审计日志 Trait
 *
 * 依据等保 2.0 (GB/T 22239) 8.1.4.6：
 * 数据导出操作需记录审计日志。
 *
 * 依据《数据安全法》第二十一条：
 * 重要数据出境需安全评估，导出操作需记录。
 *
 * 使用方式：
 *   class ExportService
 *   {
 *       use ExportAudit;
 *
 *       public function create(...): Export
 *       {
 *           $export = Export::create(...);
 *           $this->auditExport('export_created', $export->id, $export->toArray());
 *           return $export;
 *       }
 *   }
 */
trait ExportAudit
{
    /**
     * 写入导出审计日志
     *
     * @param string $event 事件名：export_created/export_downloaded/export_deleted
     * @param int|string $exportId 导出记录 ID
     * @param array $data 审计数据（自动脱敏敏感字段）
     */
    protected function auditExport(string $event, int|string $exportId, array $data = []): void
    {
        if (! class_exists(\Kylin\AuditLog\Models\AuditLog::class)) {
            return;
        }

        // 脱敏：过滤条件可能包含敏感信息
        $masked = $data;
        unset($masked['filters'], $masked['path']);

        try {
            \Kylin\AuditLog\Models\AuditLog::create([
                'event' => $event,
                'model_type' => 'export',
                'model_id' => $exportId,
                'new_values' => $masked,
                'user_id' => auth()->id(),
                'ip' => request()->ip(),
                'url' => request()->fullUrl(),
                'tag' => 'export',
            ]);
        } catch (\Throwable $e) {
            logger()->warning('导出审计日志写入失败', [
                'event' => $event,
                'export_id' => $exportId,
                'error' => $e->getMessage(),
            ]);
        }
    }
}