<?php
Class Fecha_Aux3 { 
	static public function meses($formato, $fecha_obj) {
		$meses = "enero, febrero, marzo, abril, mayo, junio, julio, agosto, septiembre, octubre, noviembre, diciembre";
		$meses = explode(", ", $meses);
		//Esta función extrae el mes en diferentes formatos para la fecha específica en cuestión.
		$casilla_mes = -1 + intval( $fecha_obj->format("m") );  //Del INPUT vienen: 
													//        fecha_obj y formato_input_ESPERADO
		$formatos_de_meses = array(
			"mmm" =>function () use ($meses, $casilla_mes) { return substr($meses[$casilla_mes], 0, 3); },
			"mmmm"=>function () use ($meses, $casilla_mes) { return $meses[$casilla_mes]; }
		);
		return call_user_func($formatos_de_meses[$formato]);
	} //Fin de meses

	static public function ano($formato_deseado, $fecha_obj) {
		//##pendiente##generalizar: lo siguiente podría plantearse como: 
		//buscar_sinonimo_canonico:
		$formatos_de_anos = array(
			array("Y", "yyyy", "YYYY"),
			array("y", "yy")
		);
		//##ABAJO: Nótese que sólo el $formato_deseado es "case insensitive", pero NO el formato output machine.
		//         Luego aquí estamos aplicando el principio de robustez, Jon Postel's law: 
		//                   "sé liberal para lo que recibes, conservador para lo que entregas"		
		$palabra_a_evaluar = $formato_deseado;
		$grupos_de_sinonimos = $formatos_de_anos;
		$formato_canonico = buscar_sinonimo_canonico($palabra_a_evaluar, $grupos_de_sinonimos);	
		//--------------------------------------------------------------------------
		$f   = $formato_canonico; //formato_machine_para_php_DATE
		$ano = $fecha_obj->format($f);
		return $ano;
	} //Fin de ano
	
	static public function periodos_en_formato_date() {
		//##ABAJO: las expresiones de abajo se utilizan en funciones "date" de diversos lenguajes, 
		//         buscamos aquí estandarizar.
		$palabras_usuales_en_formatos_DATE = array(
		  ////Mes:
				 //Mes en 3 primeras letras
		  "mmm" => function ($fecha_obj) { return  call_user_func("Fecha_Aux3::meses", "mmm",  $fecha_obj); },
		  "M"   => "mmm",
				 //Mes completo 
		  "mmmm"=> function ($fecha_obj) { return  call_user_func("Fecha_Aux3::meses", "mmmm", $fecha_obj); },
		  "F"   => "mmmm",
		  ////Año:
		          //Año en 4 dígitos
		  "yyyy"=> function ($fecha_obj) { return  call_user_func("Fecha_Aux3::ano",   "Y",    $fecha_obj); },
		          //Año en 2 dígitos
		  "yy"  => function ($fecha_obj) { return  call_user_func("Fecha_Aux3::ano",   "y",    $fecha_obj); },
		  ////Día:
		          //Día en 3 letras
		  "D"  => function ($fecha_obj) { return  call_user_func("Fecha_Aux3::dia(3)",   "y",    $fecha_obj);},
				  //Día completo
		  "l"  => function ($fecha_obj) { return  call_user_func("Fecha_Aux3::dia('full')", "y", $fecha_obj);},
		  
		);
		return $palabras_usuales_en_formatos_DATE;
	} //Fin de periodos_en_formato_date
} //Fin de Fecha_Aux3