<?php
Class Articulo extends Registro_DB {
	/*
		##Pautas:
			Que no sea necesario asignar uno por uno cada atributo de la db.
			Que cada atributo de la db se auto-valide, deduciendo el nombre del atributo,
			buscándose cómo debe validarse, y que el usuario programador no tenga que preocuparse por ello
			en absoluto.
			¿Qué hacer si un atributo tiene conflicto con un método, es decir, que sean homónimos?
	*/
	static public function siguiente($orderby="DEFAULT") { //Es static, porque el cursor es externo, es global.
														   //Para determinar el 'siguiente' no se basa en
														   //el actual objeto, sino en el cursor global que
														   //se ubica en la tabla ordenada desde la consulta
		//return self::siguiente("articulo");
		return call_user_func_array("siguiente_articulo", func_get_args()); //##wrapper
	}
	public function __get($propertyname) {
		$lista_de_propiedades_a_leer_desde_registro = array(
			"contenido", "titulo", "extracto_manual_inicio", "extracto_manual_restante"
		);
		$Articulo = $this;
		if ($propertyname==="cambios") {
			$cambios = new stdClass();
			$cambios->ultimo = new StdClass();
			$cambios->ultimo->fecha = "2026-07-31";
			$cambios->ultimo->autor = "Laura Valentina";
			return $cambios;
		} else if ($propertyname==="autor") {
			$Articulo->autor = "PEdro ";
			
			return $this->autor;
		} else if (in_array($propertyname, $lista_de_propiedades_a_leer_desde_registro, TRUE)) {		
			$articulo_id = $Articulo->id;
			$idioma = get_idioma();
			$rutaAL_contenedor  = __DIRINICIAL__ . "/articulos/";
			$rutaAL_contenedor .= "/articulo{$articulo_id}/{$idioma}";
			$rutaAL_archivo = "{$rutaAL_contenedor}/{$propertyname}.php";
			$this->$propertyname = file_get_contents($rutaAL_archivo);
			return $this->$propertyname;
		}
		error_y_salir("##20260731142039-4023dav: No se ha comprendido la propiedad $propertyname");
		//$Articulo->cambios->ultimo->fecha
	} //Fin de __get
	public function extracto($cuanto_quiere) {
		$cuanto_quiere =  UTF8toASCII($cuanto_quiere);
		//Siempre será un extracto del contenido, medido desde el comienzo del mismo.
		preg_match_nuestro("~(?<cantidad>\d+)\s*(?<unidad>\w+)~", $cuanto_quiere, $match);
		$cantidad = $match["cantidad"];
		$unidad   = $match["unidad"];
		$unidad   = strtolower($unidad);
		$unidades_posibles = array("letras", "parrafos", "parrafoenadelante");
		if(!in_array($unidad, $unidades_posibles, $STRICT_TRUE=TRUE)) {
				error_y_salir("##22060518105734-6010: No se ha desarrollado generar extracto para la unidad $unidad");
		}
		//-------------------------------------
		//Preparación de contenido:
		$contenido = trim($this->contenido);
		//##Deshabilitado, no sirve, porque no toma la cadena: $parrafos = preg_split("~[<br>\n]+~", $contenido);
		//Primero se debe eliminar <br>:
		$contenido = preg_replace("~<\s*br[\s\/]*>~", "\n", $contenido);
		$contenido = preg_replace("~\r~", "", $contenido); //Elimina el carriage return, presente en Windows
		//$contenido = preg_replace("~\s+~", " ", $contenido);
		
		
	
	
		//-------------------------------------
		
		switch($unidad) {
			case "letras":
				$numletras = $cantidad;
				$numletras_menos_uno = $numletras - 1;
				//##ABAJO: para agregar la variable, tener en cuenta: 1) no separar los números del quantificador 
				//         de rango, deben estar unidos sin espacio; 2) en el número de las letras, 
				//         al rodearlas de corchetes, eso en php significa citar una variable, entonces hay que poner 
				//         doble corchete.
				$PCRE = "~^((?=.{0,$numletras_menos_uno}(\s|$))(?:\S+\s+){0,14}\S+|.{{$numletras}})~";
				$contenido = substr($contenido, 0, 500);
				preg_match($PCRE, $contenido, $match);
				/*
				$extracto = preg_match("~^(?:(?=.{0, 75}(?:\s|$))(?:\S+\s+){0,9}\S+|.{76})~", $contenido, $match);
				$extracto = preg_match("~^((?=.{0, 75}(\s|$))(\S+\s+){0,9}\S+|.{76})~", $contenido, $match);
				$extracto = preg_match("~^((?=.{0, 75}(\s|$))(\S+\s+){0,9}\S+|.{76})~", $contenido, $match);
				$extracto = preg_match("~^.{76}~", $contenido, $match);
				*/
				$extracto = $match[0];				
				break;
			case "parrafos":
				$numparrafos = $cantidad;
				//Ahora con un solo caracter, sí se puede reemplazar
				$parrafos = preg_split("~[\r\n]+~", $contenido);
				$partes = array_slice($parrafos, 0, $numparrafos);
				$sep = "\n\n"; //Antes era <br><br>, pero eso dañaba tags multilínea
				$extracto = implode($sep, $partes);
				break;
			case "parrafoenadelante":
				$parrafo_desde = $cantidad;
				$contenido = preg_replace("~<\s*br[\s\/]*>~", "\n", $contenido);
				$contenido = preg_replace("~\r~", "", $contenido); //Elimina el carriage return, presente en Windows
				$parrafos = preg_split("~[\r\n]+~", $contenido);
				$partes = array_slice($parrafos, $parrafo_desde);
				$sep = "\n\n"; //Antes era <br><br>, pero eso dañaba tags multilínea
				$extracto = implode($sep, $partes);
				break;
		}
		return $extracto;
	} //Fin de extracto
	
	public function str_to_property($s) { //Busca convertir una string fácil
											//de entender en una property que puede implicar
								 //varios pasos para determinarse.
		//Retorna la propiedad en bruto: y ya quien lo reciba, lo modifica.
		if($s==="instante de creación") {
		} else if ($s==="ultima modificación") {
			return $this->cambios->ultimo->fecha;
		}
		error_y_salir("##Error20260731113657-1041dav: No se comprende la propiedad $s");
	}
	public function ultima_modificacion($nombredato, $formato_output="") {
		if($nombredato==="fecha") {
			$formato_input = "formato original db";
			$cual_fecha    = $this->cambios->ultimo->fecha;
			return fecha($formato_input,
						 $formato_output,
						 $cual_fecha);
		} else if ($nombredato==="autor") {
			return $this->cambios->ultimo->autor;
		}
		error_y_salir("##Error20260731125451-2141dav: No se entiende el nombredato $nombredato");
	} //Fin de ultima_modificacion
	
	public function fecha($cual_fecha, $formato_output) { //##wrapper
		$Articulo = $this;
		if($cual_fecha=="modificación") { //Se entiende última modificación
			return $Articulo->ultima_modificacion("fecha", $formato_output);
		}
		error_y_salir("##Error20260801094704-1051dav: no se comprende la variable cual_fecha $cual_fecha");
	} //Fin de fecha
}
function siguiente_articulo($orderby="DEFAULT") {
					/*
					<column_name> TIMESTAMP DEFAULT CURRENT_TIMESTAMP
					create table articulo (id int unsigned auto_increment primary key,
										   instante_de_creacion TIMESTAMP  default current_timestamp,
										   img_src varchar(255) null,
									   img_alt varchar(255) null,
										   main_category varchar(15) null,
										   author varchar(15) not null,
										   status varchar(15) not null,
										   comment_status varchar(15) not null,
										   slug text not null
										   ) comment "Contiene todo lo que es independiente del idioma" default charset=utf8;
					create table articulo_traduccion (id int, titulo_es varchar(255) null, contenido_es text null,
													          titulo_en varchar(255) null, contenido_en text null );
					cursor = query("select * from articulo inner join articulo_traduccion on articulo.id=articulo_traduccion.id");
					drafts:
					create table articulo_____draft like articulo
					create table articulo_traduccion_____draft like articulo_traduccion
					*/
					$articulo_id = globales("cursor de articulo", "++"); ##pendiente, sintetizarlo con cursor_DB
					//$articulo_id = globales("cursor de articulo", 2); ##pendiente, quitar
					$Articulo = new Articulo();
					$Articulo->id = $articulo_id;
					$Articulo->img_src = "img/real_estate_agent_new_jersey_evelyn_molina_sell_1.jpg";
					$Articulo->img_alt = "Fotografía del artículo";
					$Articulo->main_category = "main category";
					$Articulo->cambios->ultimo->fecha = "2026-01-03";
					$Articulo->cambios->ultimo->autor = "Autor";
					//$Articulo->fecha("d de mmmm");
					//$Articulo->fecha("yyyy");
					$Articulo->subtitulo = "subtitulo";

					$Articulo->status = "published";
					$Articulo->comment_status = "open";
					$Articulo->slug = "https://stackoverflow.com/questions/4230846/what-is-the-etymology-of-slug-in-a-url";
	return $Articulo;
} //Fin de siguiente_articulo