<?php
$breakpoints = array(1400, 1200, 992, 768, 576, 0);

function organizar_lista_de_breakpoints($breakpoints) {
    $breakpoints = Comun_Arrays::ordenar($breakpoints, "DESC");
    $breakpoints = Comun_Arrays::eliminar_ceros($breakpoints);
    return $breakpoints;
}

Class Comun_Arrays {
    public static function ordenar($elarray, $asc_o_desc="ASC") {
        $asc_o_desc = strtoupper($asc_o_desc);
        $callbacks = array(
            "ASC"=>"asort",
            "DESC"=>"arsort"
        );
        $callbacks[$asc_o_desc]($elarray);
        return $elarray;
    }
    public static function eliminar_ceros($elarray) {
        $filtered_array = array_filter($elarray, function($item) {
            return $item!=0;
        } );
        return $filtered_array;
    }
}

Class Logger {
    public static function log($categoria, $mensaje) {
        return;
        //Según la categoría y el contexto (si estamos en producción o desarrollo, reacciona este logger. Es como una generalización del echo)
        echo "$categoria - $mensaje\n";
    } //Fin de log
}

function imagemagick_identify($rutaRL_imagen) {
        if(! file_exists($rutaRL_imagen)) {
            error_y_salir("##Error20260707104720-2041dav: no existe el archivo $rutaRL_imagen para aplicar la función imagemagick_identify");
        }
        $alfanumerico = $GLOBALS["regex"]["alfanumerico"];

        //##ABAJO: Las comillas dobles sirven en ambos Windows y Linux
		switch (sistema_operativo()) {
			case "linux":
                switch(gethostname()) {
                    case "ubuntu3":
                        $comando = "identify \"$rutaRL_imagen\"";
                        break;
                    default:
                        $comando = "magick identify \"$rutaRL_imagen\"";
                        break;
                }
				break;
			case "windows":
				$comando = "magick identify \"$rutaRL_imagen\"";
				break;
		}
        $output = ejecutar_comando($comando);
        //elimina un pedazo:
        $r = preg_replace("~^[$alfanumerico/\._]+\s[$alfanumerico]+\s~", "", $output);
        //##ABAJO: ##Antes##20260324 empezaba por ^, es decir que era ~^(?P<width>[0-9]+.....
        //         Pero en Linux el "identify" retorna una sola línea, a diferencia de Windows, por ello se retiró.
        preg_match("~(?P<width>[0-9]+)x(?P<height>[0-9]+)~i", $r, $match);
        $height = $match["height"];
        $width = $match["width"];
        return array("width"=>$width, "height"=>$height);
} //Fin de imagemagick_identify

function mkdir_nuestro($r) {
    //##plataforma
        if(file_exists($r)) {
            if(is_dir($r)) {
                return true; //ya existe
        } else {
            die("##Error20251231203046-2021dav: el recurso existe, se esperaba directorio pero no lo es. Si es un archivo, es un error de la configuración inicial; pero si es un symlink y el programa ingresó aquí, entonces hay que revisar este algoritmo, para permitir symlinks. Revisar el recurso: $r");
        }
        } else { //No existe
            mkdir($r);
            //Y si hay error, pitar aquí. Contrastar con original mkdir_nuestro de la plataforma.
    }
}

function html_picture($config) {
    /*
     Ejemplos de casos de uso:
     Caso 1:
     * La presente función debe fabricar lo siguiente:
    -----------------------
    <picture>
			<source srcset="img/evelyn_molina_realtor_new_jersey350x585.jpg" media="(min-width: 1400px)">
        	<source srcset="componentes/fotografiaRealtor/img/evelyn_molina_realtor_new_jersey300x533.jpg" media="(min-width: 1200px)">
        	<source srcset="img/evelyn_molina_realtor_new_jersey248x496.jpg" media="(min-width: 992px)">
        	<source srcset="img/evelyn_molina_realtor_new_jersey192x384.jpg" media="(min-width: 768px)">
        	<source srcset="<?=$uribase?>/evelyn_molina_realtor_new_jersey144x288.jpg" media="(min-width: 576px)">

            <img class="d-block w-100" alt="Card image" srcset="componentes/fotografiaRealtor/img/evelyn_molina_realtor_new_jersey175x350.jpg">
            <figcaption class="card-title text-center" style="padding: 0; margin: 0;"><small> New Jersey</small></figcaption>
      </picture>
      -----------------
      Se usa el comando:
      html_picture(array(
                    "rutaRL_imagen"=>"img/evelyn_molina_realtor_new_jersey.jpg",
                    "max_width"=>350,
                    "alt"=>"Card image",
                    "figcaption"=>"New Jersey"
                    ));

      ------------------------0-------------------------------

      Caso 2: Se debe fabricar lo siguiente:
        <picture id="logo_kw-keller">
            <source srcset="img/kw-keller_williams.png" media="(min-width: 1400px)" >
            <source srcset="img/kw-keller_williams.png" media="(min-width: 1200px)" >
            <source srcset="img/kw-keller_williams.png" media="(min-width: 768px)" >
            <source srcset="img/kw-keller_williams.png" media="(min-width: 768px)" >
            <source srcset="img/kw-keller_williams.png" media="(min-width: 350px)" class="img-fluid" >
            <img src="img/kw-keller_williams.png" class="img-fluid" alt="...">
        </picture>

      ----------
      Se usa el comando:
      html_picture(array(
                        "id"=>"logo_kw-keller",
                        "max_width"=>180,
                        "img_css_class"=> "img-fluid",
                        "alt" =>"Logo of Kw Keller",
                        "figcaption"=>NULL,
                        "rutaRL_imagen"=>"img/kw-keller_williams.png",
                    ));
    */
    $alfanumerico  = $GLOBALS["regex"]["alfanumerico"];
    $rutaRL_imagen = $config["rutaRL_imagen"];
    $nombre_imagen = basename($rutaRL_imagen);
    $rutaRL_carpeta_imagen = dirname ($rutaRL_imagen);
    //$rutaAL_imagen = $rutaAL_carpeta_imagen . DIRECTORY_SEPARATOR . $nombre_imagen;
    $breakpoints = array(1400, 1200, 992, 768, 576);
    $size   =   imagemagick_identify($rutaRL_imagen);               //El tamaño de la imagen original
    $max_width  =   $config["max_width"];                               //El width deseado
    $max_height =   floor($max_width * ($size["height"]/$size["width"]));  //El height deseado
    $max_breakpoint = max($breakpoints);
    //------------------------------------------------------
    //------------##ABAJO: preg_replace_nuestro
    //##ABAJO: deberíamos crear nuestro propio preg_replace, que sí permita backreferences
    $r = preg_match("~(?P<nombre_sin_ext>.*)\.(?P<extension>[$alfanumerico]+)$~", $nombre_imagen, $match);
    if($r!==1) {
        error_y_salir("##Error20251230182755-0325dav: Ocurrió un error en el preg_match de la $rutaRL_imagen");
    }
    $nombre_sin_ext = $match["nombre_sin_ext"];
    $extension      = $match["extension"];
    //------------------------------------------------------
    //Bucle de crear o recoger las imágenes
    $picture_sources = array();
    $breakpoints = organizar_lista_de_breakpoints($breakpoints);
    $ruta_carpeta_autogen = $rutaRL_carpeta_imagen . "/autogen";
    mkdir_nuestro($ruta_carpeta_autogen);
    for($k=0; $k<count($breakpoints); $k++) {
        $b = $breakpoints[$k];
        $width  = floor( $max_width  * ($b/$max_breakpoint) );
        $height = floor( $max_height * ($b/$max_breakpoint) );
        $ruta_nueva_imagen = "$ruta_carpeta_autogen/{$nombre_sin_ext}{$width}x{$height}.{$extension}";
        //------------Fin de preg_replace_nuestro
        if(file_exists($ruta_nueva_imagen)) {
            Logger::log("archivos_creados", "Ya existe $ruta_nueva_imagen\n");
        } else { //No existe
            $opciones = " -resize {$width}x{$height} ";
            imagemagick_convert(array("ruta_original"=>$rutaRL_imagen,
                                      "ruta_final"=>$ruta_nueva_imagen,
                                      "opciones"=>$opciones));
            echo "Se ha creado $ruta_nueva_imagen\n";
        }
        $picture_sources[] = array("ruta"=>$ruta_nueva_imagen, "breakpoint"=>$b);
    }
    //Fin de Bucle de crear o recoger las imágenes
    //------------------------------------------------------
    //Bucle de crear html:
    for($k=0; $k<count($picture_sources); $k++) {
        $ruta        = $picture_sources[$k]["ruta"];
        $breakpoint  = $picture_sources[$k]["breakpoint"];
        $breakpoint_en_pixeles = $breakpoint . "px";
        $plantilla = <<<LIMITE_HEREDOC
                        <source srcset="$ruta" media="(min-width: $breakpoint_en_pixeles)">
LIMITE_HEREDOC;
        $html_picture["source"][] = trim($plantilla);
    }
    //##borrar-Le agrega la del breakpoint=0, sea que el usuario-programador la haya configurado o no en la lista de $breakpoints
    //##borrar--Porque en organizar_lista_de_breakpoints se encargó de ordenar los breakpoints y eliminar el cero si lo hubiera. Aquí
    //##borrar-Aquí forzosamente toma el último elemento
    $alt = empty($config["alt"]) ? "" : " alt=\"{$config["alt"]}\" " ;
    //##ABAJO: ya no importa el breakpoint_en_pixeles
    $img_css_class = empty($config["img_css_class"]) ? "" : " class=\"{$config["img_css_class"]}\" ";
    $ruta = $rutaRL_imagen; //Para la img de fallback, usa la $config["rutaRL_imagen"] original que llegó como parámetro, y se guarda en la variable $rutaRL_imagen
    $plantilla = <<<LIMITE_HEREDOC
                    <img $img_css_class $alt src="$ruta">
LIMITE_HEREDOC;
    $html_img = trim($plantilla);
    $ind = "\n\t\t";
    //figcaption
    /*
    $plantilla = <<<LIMITE_HEREDOC
    <figcaption class="card-title text-center" style="padding: 0; margin: 0;"><small>{{figcaption}}</small></figcaption>
LIMITE_HEREDOC;
    $plantilla = trim($plantilla);
    $html_figcaption = str_replace("{{figcaption}}", $config["figcaption"], $plantilla);
    */
    if (empty($config["figcaption"])) {
        $plantilla = "";
    } else {
        $plantilla = <<<LIMITE_HEREDOC
                    <figcaption class="card-title text-center" style="padding: 0; margin: 0;"><small>{$config["figcaption"]}</small></figcaption>
LIMITE_HEREDOC;
        $plantilla = trim($plantilla);
    }
    $html_figcaption = $plantilla;
    $s               = implode($ind, $html_picture["source"]);
    $picture_id      = empty($config["id"]) ? "" :  " id=\"{$config["id"]}\" ";
    $html_picture    = "\n<picture $picture_id >
                            {$ind}$s
                            {$ind}$html_img
                            {$ind}$html_figcaption
                      \n</picture>\n
                        ";
    echo $html_picture;
} //Fin de html_picture

function imagemagick_convert($conf) {
    $rutaORIGINAL = $conf["ruta_original"];
    $rutaFINAL    = $conf["ruta_final"];
    $opciones_str = $conf["opciones"];

	switch (sistema_operativo()) {
		case "linux":
			$comando_convert .= "convert ";
			break;
		case "windows":
			//En Windows 'convert' es un comando que se usa para transformar de FAT a NTFS
			$comando_convert .= "magick convert ";
			break;
	}
    $comando_convert .= " \"$rutaORIGINAL\" $opciones_str \"$rutaFINAL\" ";
    $output = ejecutar_comando($comando_convert);
    if($output!=="") {
        error_y_salir("#Error20251231135729-3052dav: Se esperaba un output vacío. Ha ocurrido un error en el comando $comando_convert");
    }
    //No hay retorno.
} //Fin de imagemagick_convert

$GLOBALS["regex"]["alfanumerico"] = "A-Za-z0-9";
