#!/usr/bin/env bash
set -euo pipefail
cd /home/iotcuboc/pyme || exit 1

echo "=============================================="
echo " ElaboraPro Stock V4.18.1"
echo " Buscador en una línea + Expandir verde"
echo "=============================================="

F="public/stock_v3.php"
[ -f "$F" ] || { echo "ERROR: no existe $F"; exit 1; }

TS=$(date +%Y%m%d_%H%M%S)
B="backups/elaborapro_stock_v4_18_1_$TS"
mkdir -p "$B"
cp -p "$F" "$B/"
echo "Backup: /home/iotcuboc/pyme/$B"

TMP=$(mktemp)
trap 'rm -f "$TMP"' EXIT
cp -p "$F" "$TMP"

if ! TMP="$TMP" php <<'PHP'
<?php
$f=getenv('TMP');
$s=file_get_contents($f);
if($s===false){fwrite(STDERR,"ERROR leyendo archivo.\n");exit(10);}
if(strpos($s,'ELABORAPRO_STOCK_V4_18_1')!==false){
    fwrite(STDERR,"ERROR: V4.18.1 ya aplicado.\n"); exit(11);
}

/* El diagnóstico confirma que Buscar y stock-toggle-all YA están
   dentro del mismo form. No movemos HTML ni tocamos JS. */
if(substr_count($s,'id="stock-toggle-all"') !== 1){
    fwrite(STDERR,"ERROR: stock-toggle-all no encontrado de forma única.\n"); exit(20);
}
if(substr_count($s,'name="q"') !== 1){
    fwrite(STDERR,"ERROR: input q no encontrado de forma única.\n"); exit(21);
}

/* Añadir una clase al formulario exacto que contiene q + stock-toggle-all. */
$pat='~<form\b([^>]*)>(?=(?:(?!</form>).)*name=["\']q["\'])(?=(?:(?!</form>).)*id=["\']stock-toggle-all["\'])(.*?)</form>~isu';
if(preg_match_all($pat,$s)!==1){
    fwrite(STDERR,"ERROR: formulario stock no encontrado de forma única.\n"); exit(22);
}
$s=preg_replace_callback($pat,function($m){
    $open='<form'.$m[1].'>';
    if(preg_match('~\bclass=(["\'])(.*?)\1~is',$open)){
        $open=preg_replace_callback('~\bclass=(["\'])(.*?)\1~is',function($c){
            $classes=trim($c[2].' ep-stock-search');
            return 'class='.$c[1].$classes.$c[1];
        },$open,1);
    } else {
        $open=substr($open,0,-1).' class="ep-stock-search">';
    }
    /* Se elimina sólo el style inline del form para que gobierne el CSS nuevo. */
    $open=preg_replace('~\s+style=(["\']).*?\1~is','',$open);
    return $open.$m[2].'</form>';
},$s,1,$n);
if($n!==1){fwrite(STDERR,"ERROR aplicando clase al formulario.\n");exit(23);}

/* Marcar el botón por su ID estable, no por el texto dinámico Expandir/Contraer. */
$btn='~<button\b([^>]*\bid=["\']stock-toggle-all["\'][^>]*)>~isu';
if(preg_match_all($btn,$s)!==1){
    fwrite(STDERR,"ERROR: botón stock-toggle-all no único.\n"); exit(30);
}
$s=preg_replace_callback($btn,function($m){
    $tag='<button'.$m[1].'>';
    if(preg_match('~\bclass=(["\'])(.*?)\1~is',$tag)){
        $tag=preg_replace_callback('~\bclass=(["\'])(.*?)\1~is',function($c){
            $classes=preg_replace('~\bsecondary\b~','',$c[2]);
            $classes=preg_replace('~\s+~',' ',trim($classes.' ep-stock-expand'));
            return 'class='.$c[1].$classes.$c[1];
        },$tag,1);
    } else {
        $tag=substr($tag,0,-1).' class="btn ep-stock-expand">';
    }
    return $tag;
},$s,1,$n);
if($n!==1){fwrite(STDERR,"ERROR marcando botón expandir.\n");exit(31);}

$css=<<<'CSS'

<style>
/* ELABORAPRO_STOCK_V4_18_1 */
body.op3-body .op3-main form.ep-stock-search{
    margin:15px 0!important;
    display:flex!important;
    flex-direction:row!important;
    align-items:center!important;
    gap:10px!important;
    flex-wrap:nowrap!important;
    width:100%!important;
}
body.op3-body .op3-main form.ep-stock-search input[name="q"]{
    flex:1 1 auto!important;
    width:auto!important;
    min-width:0!important;
    margin:0!important;
}
body.op3-body .op3-main form.ep-stock-search > button{
    flex:0 0 auto!important;
    width:auto!important;
    margin:0!important;
    min-height:50px!important;
}
body.op3-body .op3-main form.ep-stock-search #stock-toggle-all.ep-stock-expand{
    background:#BFE3C9!important;
    border:1px solid #A8D5B5!important;
    color:#205C36!important;
    border-radius:8px!important;
    padding-left:16px!important;
    padding-right:16px!important;
    box-shadow:none!important;
    white-space:nowrap!important;
}
body.op3-body .op3-main form.ep-stock-search #stock-toggle-all.ep-stock-expand:hover{
    background:#AEDAB9!important;
    border-color:#9BCDAA!important;
    color:#205C36!important;
}
@media (max-width:700px){
    body.op3-body .op3-main form.ep-stock-search{
        flex-wrap:wrap!important;
    }
    body.op3-body .op3-main form.ep-stock-search input[name="q"]{
        flex:1 1 100%!important;
    }
}
</style>

CSS;

$footer='~<\?php\s+render_footer_v3\(\);\s*\?>~';
if(preg_match_all($footer,$s)!==1){
    fwrite(STDERR,"ERROR: footer inesperado.\n"); exit(40);
}
$s=preg_replace($footer,$css.'<?php render_footer_v3(); ?>',$s,1);

foreach(['ELABORAPRO_STOCK_V4_18_1','ep-stock-search','ep-stock-expand','stock-toggle-all'] as $x){
    if(strpos($s,$x)===false){
        fwrite(STDERR,"ERROR validación: $x\n"); exit(50);
    }
}

if(file_put_contents($f,$s)===false){
    fwrite(STDERR,"ERROR escribiendo temporal.\n"); exit(60);
}
echo "OK: V4.18.1 preparado en temporal.\n";
PHP
then
    echo "ERROR: parche abortado. No se instaló ningún cambio."
    exit 1
fi

echo "===== LINT TEMPORAL ====="
php -l "$TMP"

echo "===== VALIDACION ====="
grep -n -B3 -A7 -E 'ep-stock-search|ep-stock-expand|ELABORAPRO_STOCK_V4_18_1' "$TMP" | tail -80

echo "===== INSTALANDO ====="
cp -p "$TMP" "$F"

if ! php -l "$F"; then
    echo "ERROR: restaurando respaldo..."
    cp -p "$B/stock_v3.php" "$F"
    exit 1
fi

echo "=============================================="
echo " OK - Stock V4.18.1 instalado"
echo " Campo + Buscar + Expandir/Contraer en línea"
echo " Expandir/Contraer = verde pastel"
echo " JavaScript y lógica de stock preservados"
echo "=============================================="
