<?php
/**
 * @package Hafenstudios\Wellenbrecher
 */

namespace Hafenstudios\Wellenbrecher\Rules;

use Hafenstudios\Wellenbrecher\Engine\Context;
use Hafenstudios\Wellenbrecher\Engine\RuleResult;

defined( 'ABSPATH' ) || exit;

/**
 * User-Agent ist eine HTTP-Bibliothek (curl, python-requests, ...):
 * legitime Browser-Submits kommen nie mit diesen Kennungen.
 */
class UaLibraryRule extends AbstractRule {

	public const ID             = 'ua_library';
	public const DEFAULT_POINTS = 35;

	/**
	 * Bekannte Bibliotheks-Kennungen (Teilstring, case-insensitive).
	 */
	public const LIBRARIES = array(
		'curl',
		'python-requests',
		'python-urllib',
		'aiohttp',
		'go-http-client',
		'okhttp',
		'wget',
		'libwww-perl',
		'guzzlehttp',
		'java/',
		'httpclient',
		'scrapy',
		'node-fetch',
		'axios/',
		'php/',
	);

	public function __construct( int $points = self::DEFAULT_POINTS ) {
		parent::__construct( $points );
	}

	public function id(): string {
		return self::ID;
	}

	public function stage(): int {
		return 1;
	}

	public function evaluate( Context $context ): RuleResult {
		$ua = strtolower( trim( $context->server( 'user_agent' ) ) );
		if ( '' === $ua ) {
			return $this->miss(); // Leerer UA ist Sache der ua_empty-Regel.
		}
		foreach ( self::LIBRARIES as $needle ) {
			if ( false !== strpos( $ua, $needle ) ) {
				return $this->hit();
			}
		}
		return $this->miss();
	}
}
