<?php
/**
 * Dynamic data token replacement helper.
 *
 * @package PrestoPlayer
 */

namespace PrestoPlayer\Support;

/**
 * Replaces dynamic data tokens (user, site, IP) with their actual values.
 */
class DynamicData {

	/**
	 * Get values to replace.
	 *
	 * @return array
	 */
	public static function getValues() {
		$current_user = wp_get_current_user();

		return apply_filters(
			'presto-player/dynamic-data',
			array(
				'{user.user_login}'      => $current_user->user_login ?? '',
				'{user.user_nicename}'   => $current_user->user_nicename ?? '',
				'{user.user_email}'      => $current_user->user_email ?? '',
				'{user.user_url}'        => $current_user->user_url ?? '',
				'{user.user_registered}' => $current_user->user_registered ?? '',
				'{user.display_name}'    => $current_user->display_name ?? '',
				'{site.url}'             => get_home_url(),
				'{site.name}'            => get_bloginfo(),
				'{ip_address}'           => self::getIP(),
			)
		);
	}

	/**
	 * Replace dynamic data with actual data.
	 *
	 * @param  array  $items Array of items, each containing the given key.
	 * @param  string $key   Key within each item whose value should be replaced.
	 * @return array
	 */
	public static function replaceItems( $items, $key ) {
		foreach ( $items as $k => $item ) {
			$items[ $k ][ $key ] = self::replaceText( $item[ $key ] );
		}

		return $items;
	}

	/**
	 * Replace value in string with dynamic data.
	 *
	 * @param string $text String with dynamic data.
	 * @return string
	 */
	public static function replaceText( $text ) {
		return wp_kses_post( strtr( $text, self::getValues() ) );
	}

	/**
	 * Get the person's IP.
	 *
	 * @return string
	 */
	public static function getIP() {
		foreach ( array( 'HTTP_CF_CONNECTING_IP', 'HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR' ) as $key ) {
			if ( array_key_exists( $key, $_SERVER ) === true ) {
				foreach ( explode( ',', sanitize_text_field( wp_unslash( $_SERVER[ $key ] ) ) ) as $ip ) {
					$ip = trim( $ip ); // Just to be safe.

					if ( filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE ) !== false ) {
						return $ip;
					}
				}
			}
		}
	}
}
