<?php
/**
 * Ajout d'une nouvelle localisation pour gérer les blocks Gutenberg
 *
 * @since 2.5.3
 */

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

const ACF_FORM_BLOCK_NAME = 'eac_block';

/**
 * eac_acf_rule_type_block
 * Filtre d'ajout d'une nouvelle règle
 *
 * @param array $choices
 *
 * @return array
 */
function eac_acf_rule_type_block( array $choices ): array {
	$choices['Forms'][ ACF_FORM_BLOCK_NAME ] = esc_html__( 'Block (EAC)', 'eac-components' );
	return $choices;
}
add_filter( 'acf/location/rule_types', 'eac_acf_rule_type_block' );

/**
 * eac_acf_rule_values_block
 * Filtre pour listes tous les blocks hormis WP et WooCommerce
 * Regrouper par espace de nom
 *
 * @param array $choices
 *
 * @return array
 */
function eac_acf_rule_values_block( array $choices ): array {
	// Récupérer tous les blocs enregistrés
	$block_types = WP_Block_Type_Registry::get_instance()->get_all_registered();

	// Organiser les blocs par namespace
	$grouped_blocks = array();

	foreach ( $block_types as $block_type ) {
		// Exclure les blocs standards WordPress (core/*)
		if ( strpos( $block_type->name, 'core/' ) === 0 || strpos( $block_type->name, 'woocommerce/' ) === 0 ) {
			continue;
		}

		// Extraire le namespace (partie avant le /)
		$parts = explode( '/', $block_type->name );
		$namespace = ! empty( $parts[0] ) ? $parts[0] : 'Other';

		// Sanitizer le namespace : supprimer tirets, underscores et autres caractères spéciaux
		$namespace_key = preg_replace( '/[^a-z0-9]/i', '', $namespace );

		// Initialiser le groupe s'il n'existe pas
		if ( ! isset( $grouped_blocks[ $namespace_key ] ) ) {
			$grouped_blocks[ $namespace_key ] = array(
				'label' => ucfirst( str_replace( array( '-', '_' ), ' ', $namespace ) ), // Label lisible
				'blocks' => array(),
			);
		}

		// Ajouter le bloc au groupe
		$grouped_blocks[ $namespace_key ]['blocks'][ $block_type->name ] = $block_type->title ? esc_html( $block_type->title ) : esc_html( $block_type->name );
	}

	// Trier les groupes alphabétiquement
	ksort( $grouped_blocks );

	// Trier les blocs dans chaque groupe et construire le tableau final
	$choices = array();
	foreach ( $grouped_blocks as $group_data ) {
		asort( $group_data['blocks'] );
		$choices[ $group_data['label'] ] = $group_data['blocks'];
	}

	return $choices;
}
add_filter( 'acf/location/rule_values/eac_block', 'eac_acf_rule_values_block' );

/**
 * eac_acf_rule_match_block
 * le group ACF apparaît nul part
 *
 * @return bool
 */
add_filter( 'acf/location/rule_match/eac_block', function () {
	return false;
}, 10, 0 );

/**
 * eac_custom_field_group_columns
 * Filtre pour ajouter une colonne personnalisée
 *
 * @param array $columns
 *
 * @return array
 */
function eac_custom_field_group_columns( array $columns ): array {
	$columns['eac-location'] = 'EAC Location';

	return $columns;
}
add_filter( 'manage_edit-acf-field-group_columns', 'eac_custom_field_group_columns' );

/**
 * eac_display_field_group_column
 * Récupère et affiche tous les champs de groupe pour un post_id
 *
 * @param string $column
 * @param string $post_id
 *
 * @return void
 */
function eac_display_field_group_column( string $column, string $post_id ): void {
	if ( 'eac-location' !== $column ) {
		return;
	}

	// Récupérer le groupe de champs
	$field_group = acf_get_field_group( $post_id );

	if ( ! $field_group || empty( $field_group['location'] ) ) {
		echo '—';
		return;
	}

	// Parcourir les règles de localisation
	$location_labels = array();

	foreach ( $field_group['location'] as $location_group ) {
		$group_labels = array();

		foreach ( $location_group as $rule ) {
			$label = '';

			// Afficher toutes les règles
			if ( 'post_type' === $rule['param'] ) {
				$post_type = get_post_type_object( $rule['value'] );
				$label = $post_type ? $post_type->labels->singular_name : $rule['value'];

				if ( '!=' === $rule['operator'] ) {
					$label = 'NOT ' . $label;
				}
			} elseif ( ACF_FORM_BLOCK_NAME === $rule['param'] ) {
				$block_types = WP_Block_Type_Registry::get_instance()->get_all_registered();

				if ( isset( $block_types[ $rule['value'] ] ) ) {
					$block_title = $block_types[ $rule['value'] ]->title ? $block_types[ $rule['value'] ]->title : $rule['value'];
					$label = 'Block = ' . esc_html( $block_title );

					if ( '!=' === $rule['operator'] ) {
						$label = 'NOT ' . $label;
					}
				}
			}

			if ( $label ) {
				$group_labels[] = $label;
			}
		}

		if ( ! empty( $group_labels ) ) {
			$location_labels[] = implode( ' + ', $group_labels );
		}
	}

	if ( ! empty( $location_labels ) ) {
		echo implode( '<br>', array_unique( $location_labels ) ); // phpcs:ignore
	} else {
		echo '—';
	}
}
add_action( 'manage_acf-field-group_posts_custom_column', 'eac_display_field_group_column', 10, 2 );

/**
 * eac_get_active_acf_block_groups
 * Récupère les groupes ACF actifs avec la règle 'eac_block' == $block_name
 *
 * @param string $block_name (optionnel) Nom du bloc pour filtrer les groupes
 *
 * @return array|bool Tableau contenant les IDs des groupes trouvés ou un booléen
 */
function eac_get_active_acf_block_groups( string $block_name = '' ) {
	// Clé de cache différente selon le paramètre
	$cache_key = empty( $block_name ) ? 'eac_block_groups_ids' : 'eac_block_groups_ids_' . sanitize_key( $block_name );

	// Vérifier le transient (sauf en dev)
	if ( ! defined( 'WP_DEBUG' ) || ! WP_DEBUG ) {
		$ids = get_transient( $cache_key );
		if ( false !== $ids ) {
			return $ids;
		}
	}

	// Calculer
	$eac_block_groups = array_filter(
		acf_get_field_groups(),
		function ( $group ) use ( $block_name ) {
			if ( ! isset( $group['active'] ) || ! $group['active'] ) {
				return false;
			}

			if ( empty( $group['location'] ) ) {
				return false;
			}

			foreach ( $group['location'] as $location_group ) {
				foreach ( $location_group as $rule ) {
					if ( isset( $rule['param'] ) && ACF_FORM_BLOCK_NAME === $rule['param'] ) {
						// Si block_name spécifié : vérifier la valeur
						if ( ! empty( $block_name ) ) {
							if ( isset( $rule['operator'] ) && '==' === $rule['operator'] && isset( $rule['value'] ) && $block_name === $rule['value'] ) {
								return true;
							}
						} else {
							// Sinon : accepter tout groupe eac_block
							return true;
						}
					}
				}
			}
			return false;
		}
	);

	$ids = wp_list_pluck( $eac_block_groups, 'ID' );
	$ids = array_values( $ids );

	// Stocker en cache seulement en production (24 heures)
	if ( ! defined( 'WP_DEBUG' ) || ! WP_DEBUG ) {
		set_transient( $cache_key, $ids, DAY_IN_SECONDS );
	}

	$label = ! empty( $block_name ) ? ' (' . $block_name . ')' : '';

	return $ids;
}
