<?php
/**
 * EAC Block Builder Library - Générateur de blocs Gutenberg en PHP pur
 * Création de la route REST pour récupérer les types de posts et leurs listes
 * Regération des attributs des blocks gérés pour synchroniser les attributs avec les champs ACF
 *
 * @since 2.5.3
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

/**
 * eac_register_route_post_types
 * Enregistre l'endpoint REST pour récupérer les types de posts et leurs listes
 *
 * @return void
 */
function eac_register_route_post_types(): void {
	register_rest_route(
		'eac-blocks/v1',
		'/post-types',
		array(
			'methods' => WP_REST_Server::READABLE,
			'callback' => 'eac_get_posts_by_type',
			'permission_callback' => function () {
				return current_user_can( 'edit_posts' );
			},
			'args' => array(
				'post_types' => array(
					'type'     => 'string',
					'required' => false,
					'sanitize_callback' => 'sanitize_text_field',
					'validate_callback' => function ( $param ) {
						return is_string( $param );
					},
				),
			),
		),
	);
}

// Enregistrer l'endpoint REST pour affichage des listes de posts par type
add_action( 'rest_api_init', 'eac_register_route_post_types', 31 );

/**
 * eac_get_posts_by_type
 *
 * @param WP_REST_Request $request
 *
 * @return WP_REST_Response
 */
function eac_get_posts_by_type( WP_REST_Request $request ): WP_REST_Response {
	$post_types = $request->get_param( 'post_types' );

	if ( empty( $post_types ) ) {
		$post_types = get_post_types( array( 'public' => true ), 'objects' );
		$post_types = array_keys( $post_types );
	} else {
		$post_types = array_map( 'trim', explode( ',', (string) $post_types ) );
		$post_types = array_values( array_filter( $post_types ) );
	}

	$grouped_posts = array();

	foreach ( $post_types as $post_type ) {
		// Saute les pages d'options
		if ( 'eac_options_page' === $post_type ) {
			continue;
		}

		$post_type_obj = get_post_type_object( $post_type );
		if ( ! $post_type_obj ) {
			continue;
		}

		$posts = get_posts( array(
			'post_type'      => $post_type,
			'posts_per_page' => -1,
			'orderby'        => 'title',
			'order'          => 'ASC',
			'post_status'    => 'publish',
		) );

		if ( ! is_wp_error( $posts ) && ! empty( $posts ) ) {
			$grouped_posts[ $post_type ] = array(
				'label' => esc_html( $post_type_obj->label ),
				'items' => array_map( function ( $post ) {
					return array(
						'title' => esc_html( $post->post_title ),
						'link'  => esc_url( get_permalink( $post->ID ) ),
					);
				}, $posts ),
			);
		}
	}
	// Tri alphabétique par label
	uasort( $grouped_posts, function ( $a, $b ) {
		return strcasecmp( $a['label'], $b['label'] );
	} );

	return rest_ensure_response( $grouped_posts );
}

/**
 * eac_sync_block_attributes
 * Filtre render_block_data : nettoie les attributs orphelins d'un bloc
 *
 * @param array $parsed_block Bloc parsé avec blockName, attrs, etc.
 * @return array Bloc avec attributs synchronisés
 */
function eac_sync_block_attributes( array $parsed_block ): array {
	if ( ! eac_is_managed_block( $parsed_block['blockName'] ?? '' ) ) {
		return $parsed_block;
	}

	$allowed_attrs = eac_get_block_allowed_attributes( $parsed_block['blockName'] );
	if ( empty( $allowed_attrs ) ) {
		return $parsed_block;
	}

	$parsed_block['attrs'] = array_intersect_key(
		$parsed_block['attrs'] ?? array(),
		array_flip( $allowed_attrs )
	);

	return $parsed_block;
}

// Synchonisation des attributs des blocks gérés pour garder seulement les attributs autorisés et pas les attributs orphelins
add_filter( 'render_block_data', 'eac_sync_block_attributes' );

/**
 * eac_is_managed_block
 * Vérifie si un bloc est dans la liste des blocs managés
 *
 * @param string $block_name Nom du bloc (ex: "eac-blocks/testimonial")
 * @return bool True si bloc managé, false sinon
 */
function eac_is_managed_block( string $block_name ): bool {
	static $managed_blocks = null;

	if ( null === $managed_blocks ) {
		$managed_blocks = get_option( 'eac_options_generated_blocks', array() );
	}

	return in_array( $block_name, $managed_blocks, true );
}

/**
 * eac_get_block_allowed_attributes
 * Récupère la liste des attributs autorisés pour un bloc enregistré
 *
 * @param string $block_name Nom du bloc (ex: "eac-blocks/testimonial")
 * @return array Liste des clés d'attributs autorisés
 */
function eac_get_block_allowed_attributes( string $block_name ): array {
	$registry = WP_Block_Type_Registry::get_instance();
	$block_type = $registry->get_registered( $block_name );

	if ( ! $block_type || empty( $block_type->attributes ) ) {
		return array();
	}

	return array_keys( (array) $block_type->attributes );
}
