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

namespace Hafenstudios\Wellenbrecher\Rules;

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

defined( 'ABSPATH' ) || exit;

/**
 * Autor-Struktur-Signale: der Autorname ist eine Domain (bzw. entspricht
 * der Domain der Autor-URL) oder sieht selbst wie eine URL aus. Menschen
 * heissen nicht "beste-kredite24.top".
 */
class AuthorStructureRule extends AbstractRule {

	public const ID             = 'author_link';
	public const DEFAULT_POINTS = 15;

	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 {
		$name = mb_strtolower( trim( $context->field( 'author_name' ) ) );
		if ( '' === $name ) {
			return $this->miss();
		}

		// Autorname enthaelt eine URL oder ist selbst eine Domain-Signatur.
		if ( preg_match( '#https?://#i', $name ) ) {
			return $this->hit();
		}
		if ( preg_match( '/^[a-z0-9][a-z0-9\-\.]*\.[a-z]{2,}$/', str_replace( ' ', '', $name ) ) && false !== strpos( $name, '.' ) ) {
			return $this->hit();
		}

		// Autorname entspricht der Domain der Autor-URL (ohne TLD verglichen).
		$host = Text::host( $context->field( 'author_url' ) );
		if ( '' !== $host ) {
			$base = preg_replace( '/\.[a-z]{2,}$/', '', $host );
			if ( '' !== $base && ( $name === $host || str_replace( array( ' ', '-' ), '', $name ) === str_replace( '-', '', $base ) ) ) {
				return $this->hit();
			}
		}

		return $this->miss();
	}
}
