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

namespace Hafenstudios\Wellenbrecher\Rules;

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

defined( 'ABSPATH' ) || exit;

/**
 * JS nie ausgefuehrt: das Timestamp-Feld traegt noch den eingebackenen
 * Zufallswert (Akismet-Muster: Zufallszahl 0-250, die das Inline-JS durch
 * den Client-Timestamp in Millisekunden ersetzt). Ein fehlendes Feld ist
 * KEIN Treffer (REST-Clients, No-JS: dafuer gibt es die Token-Regeln).
 */
class JsTimestampRule extends AbstractRule {

	public const ID             = 'js_missing';
	public const DEFAULT_POINTS = 20;

	/**
	 * Werte unterhalb dieser Schwelle koennen kein Client-Timestamp in
	 * Millisekunden sein (Zufallswert-Bereich).
	 */
	public const MIN_CLIENT_TIMESTAMP = 1000000000000;

	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 applies( Context $context ): bool {
		return empty( $context->meta['skip_token_rules'] );
	}

	public function evaluate( Context $context ): RuleResult {
		$value = trim( $context->signal( 'js_timestamp' ) );
		if ( '' === $value ) {
			return $this->miss();
		}
		if ( ! ctype_digit( $value ) || (float) $value < self::MIN_CLIENT_TIMESTAMP ) {
			return $this->hit();
		}
		return $this->miss();
	}
}
