<?php

declare(strict_types=1);

namespace App\Services\Captcha;

use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
use Throwable;

/**
 * Серверная валидация Yandex SmartCaptcha (M-2). Пустой токен → отказ без
 * запроса. status=ok → пройдено; status≠ok → отказ. При недоступности Yandex
 * (таймаут/не-200/сеть/битый JSON) — fail-open (true): UX выше антифрода,
 * второй рубеж — throttle регистрации. Site-key (фронт-виджет) — отдельно.
 */
final class YandexSmartCaptchaVerifier implements CaptchaVerifier
{
    public function verify(?string $token, ?string $ip = null): bool
    {
        if ($token === null || $token === '') {
            return false;
        }

        $payload = [
            'secret' => (string) config('services.captcha.yandex_server_key'),
            'token' => $token,
        ];
        if ($ip !== null) {
            $payload['ip'] = $ip;
        }

        try {
            $response = Http::timeout(2)
                ->asForm()
                ->post((string) config('services.captcha.yandex_validate_url'), $payload);

            if (! $response->successful()) {
                Log::warning('captcha.yandex_unreachable', ['http_status' => $response->status()]);

                return true; // fail-open
            }

            return $response->json('status') === 'ok';
        } catch (Throwable $e) {
            Log::warning('captcha.yandex_unreachable', ['error' => $e->getMessage()]);

            return true; // fail-open
        }
    }
}
