<?php

function buscar_sinonimo_canonico($palabra_a_evaluar, $grupos_de_sinonimos, $config= array()) {		
		$original_a_evaluar = $palabra_a_evaluar;
		$default_config = array(
			"case_insensitive"=>FALSE,  //Por defecto es case sensitive, por pura simplicidad
			"case_insensitive_pero_devolver_casing_como_el_del_input"=>FALSE, //Si es case insensitive, 
							//y hay match, podríamos desear mantener el hallazgo de sinónimo con 
							//el mismo casing del input original. Si es la misma palabra, no importa;
							//pero si el sinónimo es una palabra distinta, entonces se podría revisar el casing
			"reaccion_si_no_encuentra"=>"devolver_original_input", // "error"|"devolver_original_input"
		);
		//Aquí debe haber un merge entre el $default_config y el $config
		$config = Pasar_a_Plataforma::merge_default_config_and_config($default_config, $config);
		Validador::validar_config($config, "buscar_sinonimo_canonico");
		//----------------------------------------------------------------------		
		foreach($grupos_de_sinonimos as $grupo) {
			if($config["case_insensitive"]) {
				$grupo = array_map(strtolower, $grupo);
				$palabra_a_evaluar = strtolower($palabra_a_evaluar);				
			}			
			if(in_array($palabra_a_evaluar, $grupo, $STRICT_TRUE=TRUE)) {
				return $grupo[0]; //El canónico es el elemento 0 del $grupo
			}
		}
		//Si llega a este punto, es porque no encontró coincidencias
		if($config["reaccion_si_no_encuentra"]==="error") {
			error_y_salir("##20260517091556-3053: No encontró sinónimo en la función buscar_sinonimo_canonico");
		}
		// reaccion_si_no_encuentra == devolver_original_input
		return $original_a_evaluar;		
} //Fin de buscar_sinonimo_canonico

Class Pasar_a_Plataforma {
	public static function array_merge_nuestro($default_array, $array2) {
		foreach($default_array as $key=>$value) {
			if(isset($array2[$key])) {
				continue;
			} else {
				$array2[$key] = $default_array[$key];
			}		
		}
		return $array2;
	} //Fin de array_merge_nuestro
	public static function merge_default_config_and_config() {
		//Pasar a Comun_Array
		return call_user_func_array("Pasar_a_Plataforma::array_merge_nuestro", func_get_args());
	}
}


Class Validador {
	public static function validar_config($config, $contexto) {
		switch($contexto) {
			case "buscar_sinonimo_canonico":
				$variables_esperadas = array(
						"case_insensitive",
						"case_insensitive_pero_devolver_casing_como_el_del_input",
						"reaccion_si_no_encuentra"
				);
				break;
			default:
				error_y_salir("##20260517092248-3021: No se comprende el \$contexto (sin comillas sencillas) '$contexto'");
		}
		return TRUE;		
	} //Fin de validar_config
} //Fin de Validador


function UTF8toASCII($cadena) {
	/*
	Otras soluciones en: 
	https://stackoverflow.com/questions/36656161/trying-to-remove-accents-from-string-in-php/36656332#36656332	
	https://stackoverflow.com/questions/36656161/trying-to-remove-accents-from-string-in-php/36656272#36656272
	https://d3s.mff.cuni.cz/legacy/~holub/sw/phpaccents/
	https://www.experts-exchange.com/questions/25729563/Remove-accents-in-a-UTF-8-string-PHP.html
	https://dev.to/bdelespierre/convert-accentuated-character-to-their-ascii-equivalent-in-php-3kf1
	https://www.reddit.com/r/PHP/comments/tsn6p/whats_the_best_way_in_php_to_convert_characters/
	https://sergheipogor.medium.com/how-do-i-remove-accents-from-characters-in-a-php-string-a6a278a36e9c
	https://stackoverflow.com/questions/1017599/how-do-i-remove-accents-from-characters-in-a-php-string
	https://www.google.com/search?q=php+string+eliminate+accents+to+ascii+unicode
		https://www.php.net/manual/en/normalizer.normalize.php
		https://www.php.net/manual/en/class.transliterator.php
		
	*/
	//"hóla, ¿qué tal estás? eres un niño, NIÑO, güey, GÜEY è, tilde francesa € euros";
	$c = iconv("UTF-8", "ASCII//TRANSLIT", $cadena); //Fase 1
	//h'ola, ?qu'e tal est'as? eres un ni~no, NI~NO, g"uey, G"UEY `e, tilde francesa EUR euro
	$c = preg_replace("~[^A-Za-z0-9\s\-]~", "", $c); //Fase 2
	//hola que tal estas eres un nino NINO guey GUEY e tilde francesa EUR euros
	return $c;
} //Fin de UTF8toASCII


function preg_match_nuestro($pattern, $subject, &$matches = null, $flags=0, $offset = 0, $config = array()) {
	//Yo creo que esto ya existe. Es para revisar aquí los errores si no hay match
	//El único parámetro nuevo es el de $config, aquí se define el comportamiento
	//Aquí re-escribí la función, ver qué se puede fusionar y mejorar de la que ya exista en la plataforma.
	$default_config = array(
		"error_si_no_hay_match" => TRUE
	);
	$config = Pasar_a_Plataforma::merge_default_config_and_config($default_config, $config);
	// = "~(?<cantidad>\d+)\s*(?<unidad>\w+)~", $cuanto_quiere, $match);
	$r = preg_match($pattern, $subject, $matches, $flags, $offset);
	if($r===0) { //No hubo coincidencia
		if($config["error_si_no_hay_match"]) {
			error_y_salir("##Error20260518105140-2041dav: No hubo coincidencia del pattern $pattern en el subject $subject al revisar con preg_match");
		}
	} else if ($r===FALSE) { //Hubo algún error al evaluar
		error_y_salir("##Error20260518105405-3061dav: Hubo 'failure' al evaluar la preg_match. No es sólo que no hubo coincidencia: sino que además hubo 'failure', porque la función retornó FALSE. Vale la pena revisar.");
	}
	return $r; 
}