<?php

namespace Kylin\Activity\Middleware;

use Closure;
use Illuminate\Http\Request;

/**
 * 日志查看审计中间件
 *
 * 自动记录日志查看行为，满足等保 2.0 (GB/T 22239) 8.1.4.6 安全审计要求：
 * "审计记录保护" — 日志查看行为本身需被记录。
 *
 * 使用方式：
 *  Route::get('/admin/activity-logs', ...)->middleware('activity-log-viewer');
 *
 * 或注册为别名中间件后在路由组中使用：
 *  Route::middleware('activity-log-viewer')->group(function () { ... });
 */
class LogViewerAuditMiddleware
{
    /**
     * 处理请求并记录日志查看行为
     *
     * @param  Request  $request
     * @param  Closure  $next
     * @param  string|null  $logName  日志分类名称（可选）
     * @return mixed
     */
    public function handle(Request $request, Closure $next, ?string $logName = null): mixed
    {
        $response = $next($request);

        // 仅记录成功的日志查看请求
        if ($response->isSuccessful()) {
            activity($logName ?? 'audit-log-viewer')
                ->withProperties([
                    'url' => $request->fullUrl(),
                    'method' => $request->method(),
                    'ip' => $request->ip(),
                    'user_agent' => $request->userAgent(),
                    'filters' => $request->only(['log_name', 'event', 'subject_type', 'subject_id', 'causer_type', 'causer_id', 'from', 'to']),
                ])
                ->log('查看活动日志');
        }

        return $response;
    }
}