<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;

/**
 * HmacAuthMiddleware
 * -------------------
 * يتحقق من توقيع كل طلب وارد من البوت (نظير منطق hmac_auth.py بجهة البوت).
 * يُطبَّق على مجموعة routes الخاصة بـ /api/bot-internal/*
 */
class HmacAuthMiddleware
{
    protected int $toleranceSeconds = 60;

    public function handle(Request $request, Closure $next)
    {
        $secret = config('services.bot_api.secret');
        if (empty($secret)) {
            return response()->json(['error' => 'server_misconfigured'], 500);
        }

        $timestamp = $request->header('X-Timestamp');
        $nonce = $request->header('X-Nonce');
        $signature = $request->header('X-Signature');

        if (!$timestamp || !$nonce || !$signature) {
            return response()->json(['error' => 'missing_auth_headers'], 401);
        }

        // 1) التحقق من الـ timestamp
        if (abs(time() - (float) $timestamp) > $this->toleranceSeconds) {
            return response()->json(['error' => 'timestamp_out_of_range'], 401);
        }

        // 2) التحقق من عدم تكرار الـ nonce (منع replay attack)
        // نستخدم Cache بدل الذاكرة لأن PHP process-per-request
        $cacheKey = 'bot_nonce:' . $nonce;
        if (Cache::has($cacheKey)) {
            return response()->json(['error' => 'nonce_already_used'], 401);
        }

        // 3) التحقق من التوقيع
        $body = $request->getContent() ?: '';
        $message = strtoupper($request->method()) . '|' . $request->path() . '|' . $timestamp . '|' . $nonce . '|' . $body;
        $expectedSignature = hash_hmac('sha256', $message, $secret);

        if (!hash_equals($expectedSignature, $signature)) {
            return response()->json(['error' => 'invalid_signature'], 401);
        }

        // 4) تسجيل الـ nonce كمستخدَم (نحتفظ فيه ضعف مدة التسامح لضمان عدم إعادة استخدامه)
        Cache::put($cacheKey, true, $this->toleranceSeconds * 2);

        return $next($request);
    }
}
