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

namespace Hafenstudios\Wellenbrecher\Support;

defined( 'ABSPATH' ) || exit;

/**
 * Reine Text-Helfer fuer die Inhalts-Regeln (Stufe 2). Ohne WordPress-
 * Abhaengigkeiten, damit die Regeln vollstaendig unit-testbar bleiben.
 */
final class Text {

	/**
	 * Alle URLs eines Textes (http/https).
	 *
	 * @param string $text Text.
	 * @return array<int, string>
	 */
	public static function urls( string $text ): array {
		if ( '' === $text || ! preg_match_all( '#https?://[^\s<>"\']+#i', $text, $m ) ) {
			return array();
		}
		return $m[0];
	}

	/**
	 * Hostnamen aller URLs eines Textes (lowercase, ohne www.).
	 *
	 * @param string $text Text.
	 * @return array<int, string>
	 */
	public static function hosts( string $text ): array {
		$hosts = array();
		foreach ( self::urls( $text ) as $url ) {
			$host = self::host( $url );
			if ( '' !== $host ) {
				$hosts[] = $host;
			}
		}
		return $hosts;
	}

	/**
	 * Host einer einzelnen URL (lowercase, ohne www.).
	 *
	 * @param string $url URL.
	 * @return string
	 */
	public static function host( string $url ): string {
		$host = parse_url( trim( $url ), PHP_URL_HOST ); // phpcs:ignore WordPress.WP.AlternativeFunctions.parse_url_parse_url -- rein testbar ohne WP.
		if ( ! is_string( $host ) || '' === $host ) {
			return '';
		}
		$host = strtolower( $host );
		return 0 === strpos( $host, 'www.' ) ? substr( $host, 4 ) : $host;
	}

	/**
	 * Domain einer E-Mail-Adresse (lowercase), leer wenn keine erkennbar.
	 *
	 * @param string $email E-Mail-Adresse.
	 * @return string
	 */
	public static function email_domain( string $email ): string {
		$at = strrpos( $email, '@' );
		if ( false === $at ) {
			return '';
		}
		return strtolower( trim( substr( $email, $at + 1 ) ) );
	}
}
