<?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' => OsSettingsHelper::get_brand_name(),
				];
				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 ] : [];
	}
}
