<?php
/**
 * Adds a validation rules that allows us to check if a given parameter is unique.
 *
 * @package WP_Ultimo
 * @subpackage Helpers/Validation_Rules
 * @since 2.0.4
 */

namespace WP_Ultimo\Helpers\Validation_Rules;

use \WP_Ultimo\Dependencies\Rakit\Validation\Rule;
use \WP_Ultimo\Checkout\Checkout;
use \WP_Ultimo\Database\Sites\Site_Type;

// Exit if accessed directly
defined('ABSPATH') || exit;

/**
 * Validates template sites.
 *
 * @since 2.0.4
 */
class Site_Template extends Rule {

	/**
	 * Error message to be returned when this value has been used.
	 *
	 * @since 2.0.4
	 * @var string
	 */
	protected $message = '';

	/**
	 * Parameters that this rule accepts.
	 *
	 * @since 2.0.4
	 * @var array
	 */
	protected $fillableParams = array(); // phpcs:ignore
	/**
	 * Performs the actual check.
	 *
	 * @since 2.0.4
	 *
	 * @param mixed $template_id Value being checked.
	 */
 public function check($template_id) : bool { // phpcs:ignore

		$template_id = absint($template_id);

		if (!$template_id) {

			return true;

		} // end if;

		$site = wu_get_site($template_id);

		if (!$site || ($site->get_type() !== Site_Type::SITE_TEMPLATE && $site->get_type() !== Site_Type::CUSTOMER_OWNED)) {

			$this->message = __('The Template ID does not correspond to a valid Template', 'wp-ultimo');

			return false;

		} // end if;

		if ($site->get_type() === Site_Type::CUSTOMER_OWNED) {

			if (!wu_get_setting('allow_own_site_as_template')) {

				$this->message = __('You can not use your sites as template', 'wp-ultimo');

				return false;

			} // end if;

			$customer = wu_get_current_customer();

			if (!$customer || $site->get_customer_id() !== $customer->get_id()) {

				$this->message = __('The selected template is not available.', 'wp-ultimo');

				return false;

			} // end if;

			return true;

		} // end if;

		$allowed_templates = false;

		$product_ids_or_slugs = Checkout::get_instance()->request_or_session('products', array());

		$product_ids_or_slugs = array_unique($product_ids_or_slugs);

		if ($product_ids_or_slugs) {

			$products = array_map('wu_get_product', $product_ids_or_slugs);

			$limits = new \WP_Ultimo\Objects\Limitations();

			list($plan, $additional_products) = wu_segregate_products($products);

			$products = array_merge(array($plan), $additional_products);

			foreach ($products as $product) {

				$limits = $limits->merge($product->get_limitations());

			} // end foreach;

			$allowed_templates = $limits->site_templates->get_available_site_templates();

		} // end if;

		if (is_array($allowed_templates) && !in_array($template_id, $allowed_templates)) { // phpcs:ignore

			$this->message = __('The selected template is not available for this product.', 'wp-ultimo');

			return false;

		} // end if;

		return true;

	} // end check;

} // end class Site_Template;