[Back]
<?php

class OsBlockHelper {
	public static function register_blocks() {
		self::register_latepoint_category();
		self::register_block_book_button();
		self::register_block_book_form();
		self::register_block_list_of_resources();
		self::register_block_calendar();
		self::register_block_customer_dashboard();
		self::register_block_customer_login();
	}

	public static function localized_vars_for_blocks() : array {

		$has_to_pick = [ 'label' => __('Customer will pick', 'latepoint'), 'value' => '' ];
		$localized_block_vars = [];

		// AGENTS
		$localized_block_vars['agents'] = [];
		$localized_block_vars['selected_agents_options'][] = $has_to_pick;
		$localized_block_vars['selected_agents_options'][] = [ 'label' => __('Any Available', 'latepoint'), 'value' => LATEPOINT_ANY_AGENT ];
		$agents = new OsAgentModel();
		$agents = $agents->get_results_as_models();
		if($agents){
			foreach($agents as $agent){
				$localized_block_vars['selected_agents_options'][] = ['label' => $agent->full_name, 'value' => $agent->id];
				$localized_block_vars['agents'][] = [
					'name' => $agent->full_name,
					'id' => $agent->id,
					'title' => $agent->title,
					'short_description' => $agent->short_description,
					'avatar_url' => empty($agent->avatar_image_id) ? '' : $agent->get_avatar_url()];
			}
		}

		// SERVICES
		$localized_block_vars['services'] = [];
		$localized_block_vars['selected_services_options'][] = $has_to_pick;
		$services = new OsServiceModel();
		$services = $services->get_results_as_models();
		if($services){
			foreach($services as $service){
				$localized_block_vars['selected_services_options'][] = ['label' => $service->name, 'value' => $service->id];
				$localized_block_vars['services'][] = [
					'name' => $service->name,
					'id' => $service->id,
					'image_url' => empty($service->description_image_id) ? '' : $service->get_description_image_url(),
					'description' => $service->short_description,
					'category_id' => $service->category_id,
					'price_formatted' => ($service->price_min > 0) ? (($service->price_min != $service->price_max) ? __('Starts at', 'latepoint') . ' ' . $service->price_min_formatted : $service->price_min_formatted) : ''
				];
			}
		}


		// SERVICE CATEGORIES
		$localized_block_vars['service_categories'] = [];
		$localized_block_vars['selected_service_categories_options'][] = [ 'label' => __('Show All', 'latepoint'), 'value' => '' ];
		$service_categories = new OsServiceCategoryModel();
		$service_categories = $service_categories->get_results_as_models();
		if($service_categories){
			foreach($service_categories as $service_category){
				$localized_block_vars['service_categories'][] = [
					'name' => $service_category->name,
					'id' => $service_category->id
				];
				$localized_block_vars['selected_service_categories_options'][] = ['label' => $service_category->name, 'value' => $service_category->id];
			}
		}


		// LOCATIONS
		$localized_block_vars['locations'] = [];
		$localized_block_vars['selected_locations_options'][] = $has_to_pick;
		$localized_block_vars['selected_locations_options'][] = [ 'label' => __('Any Available', 'latepoint'), 'value' => LATEPOINT_ANY_LOCATION ];
		$locations = new OsLocationModel();
		$locations = $locations->get_results_as_models();
		if($locations){
			foreach($locations as $location){
				$localized_block_vars['selected_locations_options'][] = ['label' => $location->name, 'value' => $location->id];
				$localized_block_vars['locations'][] = [
					'name' => $location->name,
					'id' => $location->id,
					'category_id' => $location->category_id];
			}
		}

		$localized_block_vars['bundles'] = [];
		$localized_block_vars['selected_bundles_options'][] = $has_to_pick;
		$bundles = (new OsBundleModel())->should_be_active()->get_results_as_models();
		if ($bundles) {
			foreach ( $bundles as $bundle ) {
				$localized_block_vars['selected_bundles_options'][] = ['label' => $bundle->name, 'value' => $bundle->id];
				$localized_block_vars['bundles'][] = [
					'name'            => $bundle->name,
					'id'              => $bundle->id,
					'price_formatted' => $bundle->get_formatted_charge_amount(),
					'description'     => $bundle->short_description
				];
			}
		}

		return $localized_block_vars;
	}

	public static function register_latepoint_category() {
		add_filter('block_categories_all', function ($categories) {
			// Adding a new category.
			$categories[] = [
				'slug' => 'latepoint',
				'title' => 'LatePoint',
			];
			return $categories;
		});
	}

	public static function register_block_book_button() {
		register_block_type(LATEPOINT_ABSPATH . 'blocks/build/book-button/block.json',
			[
				'render_callback' => 'OsBlockHelper::render_book_button',
				'editor_script_handles' => ['latepoint-block-book-button']
			]);
	}

	public static function register_block_book_form() {
		register_block_type(LATEPOINT_ABSPATH . 'blocks/build/book-form/block.json',
			[
				'render_callback' => 'OsBlockHelper::render_book_form',
				'editor_script_handles' => ['latepoint-block-book-form']
			]);
	}

	public static function register_block_list_of_resources() {
		register_block_type(LATEPOINT_ABSPATH . 'blocks/build/list-of-resources/block.json',
			[
				'render_callback' => 'OsBlockHelper::render_list_of_resources',
				'editor_script_handles' => ['latepoint-block-list-of-resources']
			]);
	}


	public static function register_block_calendar(): void {
		register_block_type( LATEPOINT_ABSPATH . 'blocks/build/calendar/block.json',
			[
				'render_callback'       => 'OsBlockHelper::render_calendar',
				'editor_script_handles' => [ 'latepoint-block-calendar' ]
			] );
	}

	public static function register_block_customer_dashboard(): void {
		register_block_type( LATEPOINT_ABSPATH . 'blocks/build/customer-dashboard/block.json',
			[
				'render_callback'       => 'OsBlockHelper::render_customer_dashboard',
				'editor_script_handles' => [ 'latepoint-block-customer-dashboard' ]
			] );
	}

	public static function register_block_customer_login(): void {
		register_block_type( LATEPOINT_ABSPATH . 'blocks/build/customer-login/block.json',
			[
				'render_callback'       => 'OsBlockHelper::render_customer_login',
				'editor_script_handles' => [ 'latepoint-block-customer-login' ]
			] );
	}


	public static function render_book_button($attributes, $content) {
		return do_shortcode('[latepoint_book_button ' . self::attributes_to_data_params($attributes) . ']');
	}

	public static function render_book_form($attributes, $content) {
		return do_shortcode('[latepoint_book_form ' . self::attributes_to_data_params($attributes) . ']');
	}

	public static function add_block_styles_to_page() {
		if (is_page() && $styles = get_option('latepoint_blocks_styles_' . get_the_ID())) {
			wp_add_inline_style('latepoint-main-front', $styles);
		}
	}

	public static function render_list_of_resources($attributes, $content) {
		return do_shortcode('[latepoint_resources ' . self::attributes_to_data_params($attributes) . ']');
	}

	public static function render_calendar($attributes, $content) {
		return do_shortcode('[latepoint_calendar ' . self::attributes_to_data_params($attributes) . ']');
	}

	public static function render_customer_dashboard($attributes, $content) {
		return do_shortcode('[latepoint_customer_dashboard ' . self::attributes_to_data_params($attributes) . ']');
	}

	public static function render_customer_login($attributes, $content) {
		return do_shortcode('[latepoint_customer_login ' . self::attributes_to_data_params($attributes) . ']');
	}

	/**
	 * Prepare data for shortcode
	 * @param array $settings
	 * @param array $allowed_params
	 *
	 * @return string
	 */
	public static function attributes_to_data_params( array $settings, array $allowed_params = [] ): string {
		$data_html = '';
		foreach ( $settings as $key => $value ) {
			if(empty($value)) continue;

			if ( !empty($allowed_params) && ! in_array( $key, $allowed_params ) ) {
				continue;
			}

			if ( is_array( $value ) ) {
				$value = implode( ',', $value );
			}
			if (is_bool($value)) {
				$value = $value ? 'yes' : 'no';
			}

			$data_html .= $key . '="' . esc_attr( $value ) . '" ';
		}

		return $data_html;
	}

	/**
	 * When save page - save gutenberg blocks styles to options
	 * @param $page_id
	 * @return void
	 */
	public static function save_blocks_styles($page_id): void {
		if (wp_is_post_revision($page_id)) return;

		$styles = '';

		if (has_block('latepoint/list-of-resources', $page_id) ||
		    has_block('latepoint/book-button', $page_id)
		) {
			$post_content = get_post_field('post_content', $page_id);
			$blocks = parse_blocks($post_content);
			$styles = self::generate_styles_for_blocks($blocks);
		}

		self::save_blocks_styles_in_options($page_id, $styles);
	}

	private static function generate_styles_for_blocks( $blocks ): string {
		$styles = '';

		foreach ( $blocks as $block ) {
			switch ( $block['blockName'] ) {
				case 'latepoint/list-of-resources':
					$styles .= self::generate_styles_for_list_of_resources( $block['attrs'] );
					break;
				case 'latepoint/book-button':
					$styles .= self::generate_styles_for_book_button( $block['attrs'] );
					break;
			}

			if ( ! empty( $block['innerBlocks'] ) ) {
				$styles .= self::generate_styles_for_blocks( $block['innerBlocks'] );
			}
		}

		return $styles;
	}

	/**
	 * Save gutenberg blocks styles in wp options. if styles is empty - delete option
	 * @param int $page_id
	 * @param string $styles
	 *
	 * @return void
	 */
	private static function save_blocks_styles_in_options(int $page_id, string $styles = "" ):void {
		$option_name = 'latepoint_blocks_styles_' . $page_id;
		if (trim($styles) == '') {
			if(get_option($option_name)) delete_option($option_name);
		} else {
			update_option($option_name, $styles);
		}
	}

	/**
	 * Styles for gutenberg block "Book Button"
	 * @param $attrs
	 *
	 * @return string
	 */
	public static function generate_styles_for_book_button($attrs): string {
		$styles = [];
		if (!empty($attrs['is_inherit'])) return "";

		$prefix = ".latepoint-book-button.latepoint-book-button-". $attrs['id'];

		$styles[$prefix . "," . $prefix . ":focus"] = [
			'font-weight' => $attrs['font_weight'] ?? '',
			'text-transform' => $attrs['text_transform'] ?? '',
			'font-family' => $attrs['font_family'] ?? '',
			'line-height' => $attrs['line_height'] ?? '',
			'letter-spacing' => $attrs['letter_spacing'] ?? '',
			'border-color' => $attrs['border_color'] ?? '',
			'border-width' => $attrs['border_width'] ?? '',
			'border-style' => $attrs['border_style'] ?? '',
		];

		if ($styles[ $prefix]['border-style'] == 'default') {
			unset($styles[ $prefix]['border-style']);
		}

		$styles[$prefix . ":hover"] = [
			'background-color' => $attrs['bg_color_hover'] . " !important" ?? "",
			'color' => $attrs['text_color_hover'] . " !important" ?? '',
			'border-color' => $attrs['border_color_hover'] . " !important" ?? '',
		];
		return self::generate_css($styles);
	}

	/**
	 * Styles for gutenberg block "List of Resources"
	 *
	 * @param array $attrs
	 * @return string
	 */
	public static function generate_styles_for_list_of_resources(array $attrs): string {

		$styles = [];
		if (!empty($attrs['is_inherit'])) return "";

		$card_prefix = ".latepoint-resources-items-w .resource-item.resource-item-". $attrs['id'];

		$styles[ $card_prefix . ' .latepoint-book-button' ] = [
			'background-color' => $attrs['button_bg_color'] ?? "",
			'color'            => $attrs['button_text_color'] ?? "",
			'font-size'        => $attrs['button_font_size'] ?? "",
			'font-weight'      => $attrs['font_weight'] ?? "",
			'text-transform'   => $attrs['text_transform'] ?? "",
			'font-family'      => $attrs['font_family'] ?? "",
			'line-height'      => $attrs['line_height'] ?? "",
			'letter-spacing'   => $attrs['letter_spacing'] ?? "",
			'border-radius'    => $attrs['button_border_radius'] ?? "",
			'border-color'     => $attrs['border_color'] ?? "",
			'border-style'     => $attrs['border_style'] ?? "",
			'border-width'     => $attrs['border_width'] ?? "",
			'padding'          => $attrs['padding'] ?? ""
		];

		if ($styles[ $card_prefix . ' .latepoint-book-button' ]['border-style'] == 'default') {
			unset($styles[ $card_prefix . ' .latepoint-book-button' ]['border-style']);
		}

		$styles[ $card_prefix . ' .latepoint-book-button:hover' ] = [
			'background-color' => $attrs['bg_color_hover'] ?? "",
			'border-color'     => $attrs['border_color_hover'] ?? "",
			'color'            => $attrs['text_color_hover'] ?? "",
		];
		$styles[ $card_prefix ] = [
			'padding'          => $attrs['card_padding'] ?? "",
			'box-shadow'       => $attrs['card_box_shadow'] ?? "",
			'border-style'     => $attrs['card_border_style'] ?? "",
			'border-radius'    => $attrs['card_border_radius'] ?? "",
			'border-width'     => $attrs['card_border_width'] ?? "",
			'border-color'     => $attrs['card_border_color'] ?? "",
			'background-color' => $attrs['card_bg_color'] ?? "",
		];
		$styles[ $card_prefix . " .ri-name > *" ] = [
			'font-size' => $attrs['title_font_size'] ?? "",
			'color' => $attrs['card_text_color'] ?? ""
		];
		$styles[ $card_prefix . ":hover .ri-name > *" ] = [
			'color' => $attrs['card_text_color_hover'] ?? ""
		];
		$styles[ $card_prefix . " .ri-price" ] = [
			'font-size' => $attrs['price_font_size'] ?? "",
			'color' => $attrs['card_price_color'] ?? ""
		];
		$styles[ $card_prefix . ":hover .ri-price" ] = [
			'color' => $attrs['card_price_color_hover'] ?? ""
		];
		$styles[ $card_prefix . " .ri-description" ] = [
			'font-size' => $attrs['descr_font_size'] ?? "",
			'color' => $attrs['card_descr_color'] ?? ""
		];
		$styles[ $card_prefix . ":hover .ri-description" ] = [
			'color' => $attrs['card_descr_color_hover'] ?? ""
		];

		if ($styles[$card_prefix]['card_border_style'] == 'default') {
			unset($styles[$card_prefix]['border-style']);
		}

		$styles[ $card_prefix . ":hover" ] = [
			'border-color'     => $attrs['card_border_color_hover'] ?? "",
			'background-color' => $attrs['card_bg_color_hover'] ?? "",
			'color'            => $attrs['card_text_color_hover'] ?? "",
		];
		$styles[ $card_prefix . ":hover .ri-name h3" ] = [
			'color' => $attrs['card_text_color_hover'] ?? ""
		];
		$styles[ $card_prefix . " .ri-name h3" ] = [
			'color' => $attrs['card_text_color'] ?? ""
		];
		return self::generate_css($styles);
	}

	/**
	 * Convert array with styles to string
	 *
	 * @param array $selectors
	 * @return string
	 */
	public static function generate_css(array $selectors): string {
		$styling_css = '';

		foreach ( $selectors as $selector => $options ) {

			$css = '';

			foreach ( $options as $option_name => $option_val ) {
				if ( empty( $option_val ) ) {
					continue;
				}
				$css .= $option_name . ': ' . $option_val . ';';
			}
			if ( ! empty( $css ) ) {
				$styling_css     .= $selector . '{';
				$styling_css .= $css . '}';
			}
		}

		return $styling_css;
	}

	/**
	 * Retrieve Ids by resources
	 * @param string $resource
	 * @param array $settings
	 *
	 * @return string
	 */
	public static function get_ids_from_resources(string $resource, array $settings): array
	{
		$resourceMap = [
			'services'   => 'item_ids_services',
			'locations'  => 'item_ids_locations',
			'agents'     => 'item_ids_agents',
			'bundles'    => 'item_ids_bundles',
		];

		if (!array_key_exists($resource, $resourceMap)) {
			return [];
		}

		$idsKey = $resourceMap[$resource];

		return !empty($settings[$idsKey]) ? $settings[$idsKey] : [];
	}

}