<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use App\Models\OperationLog as OperationLogModel;

/**
 * 操作日志中间件
 * 自动记录写操作（POST/PUT/PATCH/DELETE）
 */
class OperationLog
{
    /**
     * 不记录的路由
     */
    private array $except = [
        'api/v1/auth/login',
        'api/v1/auth/me',
    ];

    public function handle(Request $request, Closure $next)
    {
        $response = $next($request);

        // 仅记录写操作
        if (!in_array($request->method(), ['POST', 'PUT', 'PATCH', 'DELETE'])) {
            return $response;
        }

        // 排除白名单
        foreach ($this->except as $pattern) {
            if ($request->is($pattern)) {
                return $response;
            }
        }

        $user = $request->user();
        if (!$user) {
            return $response;
        }

        try {
            // 从 URL 推断模块和操作
            $path = $request->path();
            $module = $this->parseModule($path);
            $action = $this->parseAction($request->method());

            OperationLogModel::create([
                'store_id' => $user->store_id,
                'user_id' => $user->id,
                'user_name' => $user->name,
                'module' => $module,
                'action' => $action,
                'target' => $path,
                'ip' => $request->ip(),
                'method' => $request->method(),
                'url' => $request->fullUrl(),
                'created_at' => now(),
            ]);
        } catch (\Throwable $e) {
            // 日志记录失败不影响业务
            \Log::warning('操作日志记录失败: ' . $e->getMessage());
        }

        return $response;
    }

    private function parseModule(string $path): string
    {
        // api/v1/system/users → system
        $segments = explode('/', $path);
        return $segments[2] ?? 'unknown';
    }

    private function parseAction(string $method): string
    {
        return match ($method) {
            'POST' => 'create',
            'PUT', 'PATCH' => 'update',
            'DELETE' => 'delete',
            default => $method,
        };
    }
}
