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

namespace Hafenstudios\Wellenbrecher\Rules;

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

defined( 'ABSPATH' ) || exit;

/**
 * Homoglyphen: gemischte Schriftsysteme innerhalb EINES Wortes (z.B. ein
 * kyrillisches "о" in einem lateinischen Wort). Legitime mehrsprachige
 * Texte mischen Skripte zwischen Woertern, nie innerhalb eines Wortes;
 * Spam nutzt das zum Filter-Umgehen.
 */
class HomoglyphRule extends AbstractRule {

	public const ID             = 'homoglyph';
	public const DEFAULT_POINTS = 25;

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

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

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

	public function evaluate( Context $context ): RuleResult {
		$text = $context->field( 'content' ) . ' ' . $context->field( 'author_name' );
		if ( '' === trim( $text ) ) {
			return $this->miss();
		}

		if ( ! preg_match_all( '/\p{L}+/u', $text, $m ) ) {
			return $this->miss();
		}

		foreach ( $m[0] as $word ) {
			if ( mb_strlen( $word ) < 3 ) {
				continue;
			}
			$has_latin = (bool) preg_match( '/\p{Latin}/u', $word );
			$has_other = (bool) preg_match( '/[\p{Cyrillic}\p{Greek}]/u', $word );
			if ( $has_latin && $has_other ) {
				return $this->hit();
			}
		}
		return $this->miss();
	}
}
