<?php
/**
 * StarRating Component Class.
 *
 * Renders a static star rating display.
 *
 * @package Tutor\Components
 * @author Themeum
 * @link https://themeum.com
 * @since 4.0.0
 */

namespace Tutor\Components;

defined( 'ABSPATH' ) || exit;

use TUTOR\Icon;

/**
 * Class StarRating
 *
 * Example Usage:
 * ```
 * StarRating::make()
 *     ->rating(4.5)
 *     ->show_average(true)
 *     ->render();
 * ```
 *
 * @since 4.0.0
 */
class StarRating extends BaseComponent {

	/**
	 * Rating value
	 *
	 * @since 4.0.0
	 *
	 * @var float
	 */
	protected $rating = 0;

	/**
	 * Whether to show numerical rating
	 *
	 * @since 4.0.0
	 *
	 * @var bool
	 */
	protected $show_average = false;

	/**
	 * Star icon size
	 *
	 * @since 4.0.0
	 *
	 * @var int
	 */
	protected $icon_size = 16;

	/**
	 * Review count
	 *
	 * @since 4.0.0
	 *
	 * @var int|null
	 */
	protected $count = null;

	/**
	 * Set rating value
	 *
	 * @since 4.0.0
	 *
	 * @param float $rating rating.
	 *
	 * @return self
	 */
	public function rating( float $rating ): self {
		$this->rating = $rating;
		return $this;
	}

	/**
	 * Set whether to show average rating text
	 *
	 * @since 4.0.0
	 *
	 * @param bool $show show average.
	 *
	 * @return self
	 */
	public function show_average( bool $show = true ): self {
		$this->show_average = $show;
		return $this;
	}

	/**
	 * Set icon size
	 *
	 * @since 4.0.0
	 *
	 * @param int $size size.
	 *
	 * @return self
	 */
	public function icon_size( int $size ): self {
		$this->icon_size = $size;
		return $this;
	}

	/**
	 * Set review count
	 *
	 * @since 4.0.0
	 *
	 * @param int $count count.
	 *
	 * @return self
	 */
	public function count( int $count ): self {
		$this->count = $count;
		return $this;
	}

	/**
	 * Get component content
	 *
	 * @since 4.0.0
	 *
	 * @return string
	 */
	public function get(): string {
		$rating    = $this->rating;
		$icon_size = $this->icon_size;

		$star_fill = SvgIcon::make()->name( Icon::STAR_FILL )->size( $icon_size )->ignore_kids()->get();
		$star_half = SvgIcon::make()->name( Icon::STAR_HALF )->size( $icon_size )->ignore_kids()->get();
		$star      = SvgIcon::make()->name( Icon::STAR_LINE )->size( $icon_size )->ignore_kids()->get();

		ob_start();
		?>
		<div class="tutor-ratings-stars tutor-flex tutor-items-center tutor-gap-1" data-rating-value="<?php echo esc_attr( $rating ); ?>">
			<div class="tutor-flex tutor-items-center tutor-gap-1">
				<?php for ( $i = 1; $i <= 5; $i++ ) : ?>
					<span class="tutor-icon-exception4 tutor-flex-center">
						<?php
						if ( (int) $rating >= $i ) {
							echo $star_fill; // phpcs:ignore -- get_svg_icon returns escaped html
						} elseif ( ( $rating - $i ) >= -0.5 ) {
							echo $star_half; // phpcs:ignore -- get_svg_icon returns escaped html
						} else {
							echo $star; // phpcs:ignore -- get_svg_icon returns escaped html
						}
						?>
					</span>
				<?php endfor; ?>
			</div>

			<?php if ( $this->show_average || $this->count ) : ?>
				<div class="tutor-ratings-meta tutor-flex tutor-items-center tutor-gap-1 tutor-ml-1">
					<?php if ( $this->show_average ) : ?>
						<span class="tutor-small tutor-font-medium tutor-text-primary">
							<?php echo esc_html( number_format( $rating, 1 ) ); ?>
						</span>
					<?php endif; ?>

					<?php if ( $this->count ) : ?>
						<span class="tutor-small tutor-text-subdued">
							<?php
							/* translators: %s: review count */
							echo esc_html( sprintf( _n( '(%s Review)', '(%s Reviews)', $this->count, 'tutor' ), number_format_i18n( $this->count ) ) );
							?>
						</span>
					<?php endif; ?>
				</div>
			<?php endif; ?>
		</div>
		<?php

		$this->component_string = ob_get_clean();
		return $this->component_string;
	}
}
