#!/usr/bin/env bash
set -e

cd /home/iotcuboc/pyme || exit 1

echo "=============================================="
echo " ElaboraPro Compras V4.11.2"
echo "=============================================="

TS=$(date +%Y%m%d_%H%M%S)
B="backups/elaborapro_compras_v4_11_2_$TS"
mkdir -p "$B"
cp -p public/compras_v3.php "$B/"
cp -p public/compra_editar_v3.php "$B/"
echo "Backup: /home/iotcuboc/pyme/$B"

# Trabajar sobre copias temporales. Solo reemplazamos originales si todo valida.
TMP_C=$(mktemp)
TMP_D=$(mktemp)
trap 'rm -f "$TMP_C" "$TMP_D"' EXIT
cp -p public/compras_v3.php "$TMP_C"
cp -p public/compra_editar_v3.php "$TMP_D"

TMP_C="$TMP_C" TMP_D="$TMP_D" php <<'PHP'
<?php
$fc = getenv('TMP_C');
$fd = getenv('TMP_D');

$c = file_get_contents($fc);
$d = file_get_contents($fd);

if ($c === false || $d === false) {
    fwrite(STDERR, "ERROR: no fue posible leer archivos temporales.\n");
    exit(1);
}

if (strpos($c, 'ELABORAPRO_COMPRAS_V4_11_2') !== false) {
    fwrite(STDERR, "ERROR: V4.11.2 ya parece estar aplicado.\n");
    exit(1);
}

/* Detectar si una versión anterior sí alcanzó a modificar contenido. */
if (strpos($c, 'name="proveedor_id"') !== false ||
    strpos($c, '$proveedorNombre') !== false ||
    strpos($d, '¿Eliminar esta línea?') !== false) {
    fwrite(STDERR, "ERROR: se detectaron cambios parciales de una versión anterior. No se modifica nada.\n");
    exit(1);
}

function replaceOnce(&$s, $old, $new, $label) {
    $count = substr_count($s, $old);
    if ($count !== 1) {
        fwrite(STDERR, "ERROR patrón {$label}: coincidencias={$count}\n");
        exit(1);
    }
    $s = str_replace($old, $new, $s);
}

function regexOnce(&$s, $pattern, $replacement, $label) {
    $result = preg_replace($pattern, $replacement, $s, 1, $count);
    if ($result === null || $count !== 1) {
        fwrite(STDERR, "ERROR patrón {$label}: coincidencias={$count}\n");
        exit(1);
    }
    $s = $result;
}

/*
 * 1) Carga de proveedores.
 * Tolerante a LF/CRLF y espacios.
 */
$providerLoad = <<<'CODE'

/* ELABORAPRO_COMPRAS_V4_11_2 */
$proveedoresCompra = [];
$stProveedores = $pdo->prepare("
    SELECT id, nombre, rut
    FROM proveedores
    WHERE empresa_id = ?
      AND COALESCE(activo,1) = 1
    ORDER BY nombre ASC
");
$stProveedores->execute([$eid]);
$proveedoresCompra = $stProveedores->fetchAll(PDO::FETCH_ASSOC);
CODE;

regexOnce(
    $c,
    '/(\$err\s*=\s*[\'"]{2}\s*;)/',
    '$1' . $providerLoad,
    'cabecera $err'
);

/* 2) Validación server-side del proveedor activo. */
$providerValidation = <<<'CODE'
        $fecha = $_POST['fecha'] ?: date('Y-m-d');

        $proveedorId = (int)($_POST['proveedor_id'] ?? 0);

        if ($proveedorId <= 0) {
            throw new Exception('Debe seleccionar un proveedor.');
        }

        $stProveedor = $pdo->prepare("
            SELECT nombre
            FROM proveedores
            WHERE empresa_id = ?
              AND id = ?
              AND COALESCE(activo,1) = 1
            LIMIT 1
        ");
        $stProveedor->execute([$eid, $proveedorId]);
        $proveedorNombre = $stProveedor->fetchColumn();

        if ($proveedorNombre === false) {
            throw new Exception('El proveedor seleccionado no existe o está inactivo.');
        }

        $stmt = $pdo->prepare("
CODE;

regexOnce(
    $c,
    '/[ \t]*\$fecha\s*=\s*\$_POST\[[\'"]fecha[\'"]\]\s*\?:\s*date\([\'"]Y-m-d[\'"]\)\s*;\s*\R+\s*\$stmt\s*=\s*\$pdo->prepare\("/',
    $providerValidation,
    'fecha + INSERT'
);

/* 3) Mantener snapshot textual en compras.proveedor. */
regexOnce(
    $c,
    '/(\$stmt->execute\(\[\s*\R\s*\$eid\s*,\s*\R)\s*trim\(\$_POST\[[\'"]proveedor[\'"]\]\s*\?\?\s*[\'"]{2}\)\s*,/',
    '$1            $proveedorNombre,',
    'execute proveedor'
);

/* 4) Input libre -> selector activo. */
$select = <<<'HTML'
            <p>
                <label>Proveedor</label>
                <select name="proveedor_id" required>
                    <option value="">-- Seleccione proveedor --</option>
                    <?php foreach ($proveedoresCompra as $p): ?>
                        <option
                            value="<?= (int)$p['id'] ?>"
                            <?= ((int)($_POST['proveedor_id'] ?? 0) === (int)$p['id']) ? 'selected' : '' ?>
                        >
                            <?= h($p['nombre']) ?><?= !empty($p['rut']) ? ' | ' . h($p['rut']) : '' ?>
                        </option>
                    <?php endforeach; ?>
                </select>

                <?php if (!$proveedoresCompra): ?>
                    <small class="muted">
                        No hay proveedores activos. Cree o active un proveedor antes de registrar una compra.
                    </small>
                <?php endif; ?>
            </p>
HTML;

regexOnce(
    $c,
    '/[ \t]*<p>\s*\R\s*<label>\s*Proveedor\s*<\/label>\s*\R\s*<input\s+name=[\'"]proveedor[\'"]\s*\/?>\s*\R\s*<\/p>/',
    $select,
    'selector proveedor'
);

/* 5) Crear compra azul. */
regexOnce(
    $c,
    '/<button\s+class=[\'"]btn[\'"]>\s*Crear compra\s*<\/button>/',
    '<button class="btn ep-purchase-primary" <?= !$proveedoresCompra ? \'disabled\' : \'\' ?>>Crear compra</button>',
    'Crear compra'
);

/* 6) Detalle neutral. */
regexOnce(
    $c,
    '/<a\s+class=[\'"]badge[\'"]\s+href=[\'"]<\?=\s*BASE_URL\s*\?>\/compra_editar_v3\.php\?id=<\?=\s*\(int\)\$r\[[\'"]id[\'"]\]\s*\?>[\'"]>/',
    '<a class="btn secondary ep-purchase-action" href="<?= BASE_URL ?>/compra_editar_v3.php?id=<?= (int)$r[\'id\'] ?>">',
    'Detalle'
);

/* 7) Confirmar azul: limitarlo al bloque que contiene confirmar=. */
$confirmPattern = '/class=[\'"]badge good[\'"](?=[\s\S]{0,250}confirmar=<\?=\s*\(int\)\$r\[[\'"]id[\'"]\])/';
regexOnce(
    $c,
    $confirmPattern,
    'class="btn ep-purchase-primary ep-purchase-action"',
    'Confirmar'
);

/* 8) Agregar línea azul. */
regexOnce(
    $d,
    '/<button\s+class=[\'"]btn[\'"]>\s*Agregar línea\s*<\/button>/',
    '<button class="btn ep-purchase-primary">Agregar línea</button>',
    'Agregar línea'
);

/* 9) Quitar -> Eliminar rojo. */
regexOnce(
    $d,
    '/class=[\'"]badge bad[\'"](\s*\R\s*onclick=[\'"]return confirm\([\'"]¿Quitar esta línea\?[\'"]\)[\'"])/',
    'class="btn action-danger ep-purchase-action"$1',
    'clase Quitar'
);

replaceOnce(
    $d,
    "onclick=\"return confirm('¿Quitar esta línea?')\"",
    "onclick=\"return confirm('¿Eliminar esta línea?')\"",
    'confirmación Eliminar'
);

regexOnce(
    $d,
    '/>\s*\R\s*Quitar\s*\R\s*<\/a>/',
    ">\n                                Eliminar\n                            </a>",
    'texto Eliminar'
);

/* 10) CSS antes del footer. */
$css = <<<'CSS'

<style>
/* ElaboraPro Compras V4.11.2 */
.op3-main .ep-purchase-primary{
    background:var(--ep-blue,#1769F5);
    border-color:var(--ep-blue,#1769F5);
    color:#fff;
}
.op3-main .ep-purchase-primary:hover{
    background:var(--ep-action-hover,#0D57D7);
    border-color:var(--ep-action-hover,#0D57D7);
    color:#fff;
}
.op3-main .ep-purchase-primary:disabled{
    opacity:.48;
    cursor:not-allowed;
}
.op3-main .ep-purchase-action{
    display:inline-flex;
    align-items:center;
    justify-content:center;
    min-height:34px;
    padding:6px 12px;
    border-radius:8px;
    line-height:1.15;
    text-decoration:none;
    white-space:nowrap;
}
.op3-main .action-danger.ep-purchase-action{
    background:var(--ep-danger-bg,#F3C2BE);
    border-color:var(--ep-danger-border,#EAB0AB);
    color:var(--ep-danger-text,#8B302C);
}
.op3-main .action-danger.ep-purchase-action:hover{
    background:var(--ep-danger-hover,#ECB3AE);
    border-color:var(--ep-danger-border,#EAB0AB);
    color:var(--ep-danger-text,#8B302C);
}
</style>

CSS;

$footerPattern = '/<\?php\s+render_footer_v3\(\);\s*\?>/';
if (preg_match_all($footerPattern, $c) !== 1 || preg_match_all($footerPattern, $d) !== 1) {
    fwrite(STDERR, "ERROR: footer no encontrado de forma única.\n");
    exit(1);
}
$c = preg_replace($footerPattern, $css . '<?php render_footer_v3(); ?>', $c, 1);
$d = preg_replace($footerPattern, $css . '<?php render_footer_v3(); ?>', $d, 1);

/* Validación en memoria. */
foreach ([
    'ELABORAPRO_COMPRAS_V4_11_2',
    'name="proveedor_id"',
    '$proveedorNombre',
    'ep-purchase-primary',
    'ep-purchase-action',
    'upsert_stock_delta'
] as $needle) {
    if (strpos($c, $needle) === false) {
        fwrite(STDERR, "ERROR validación compras: {$needle}\n");
        exit(1);
    }
}

foreach ([
    'ep-purchase-primary',
    'action-danger ep-purchase-action',
    '¿Eliminar esta línea?',
    'Eliminar'
] as $needle) {
    if (strpos($d, $needle) === false) {
        fwrite(STDERR, "ERROR validación detalle: {$needle}\n");
        exit(1);
    }
}

if (file_put_contents($fc, $c) === false || file_put_contents($fd, $d) === false) {
    fwrite(STDERR, "ERROR escribiendo temporales.\n");
    exit(1);
}

echo "OK: transformaciones V4.11.2 preparadas en archivos temporales.\n";
PHP

echo
echo "===== LINT TEMPORAL ====="
php -l "$TMP_C"
php -l "$TMP_D"

echo
echo "===== VALIDACION TEMPORAL ====="
grep -n -E \
'ELABORAPRO_COMPRAS_V4_11_2|proveedor_id|proveedorNombre|ep-purchase-primary|ep-purchase-action|Eliminar' \
"$TMP_C" "$TMP_D" | head -n 120

echo
echo "===== VALIDAR STOCK EN TEMPORAL ====="
grep -n -B5 -A14 'upsert_stock_delta' "$TMP_C"

echo
echo "===== INSTALANDO ARCHIVOS VALIDADOS ====="
cp -p "$TMP_C" public/compras_v3.php
cp -p "$TMP_D" public/compra_editar_v3.php

echo
echo "===== LINT FINAL ====="
if ! php -l public/compras_v3.php || ! php -l public/compra_editar_v3.php; then
    echo "ERROR: lint final. Restaurando respaldo..."
    cp -p "$B/compras_v3.php" public/compras_v3.php
    cp -p "$B/compra_editar_v3.php" public/compra_editar_v3.php
    exit 1
fi

echo
echo "===== HTTP ====="
curl -s -o /dev/null -w "compras -> HTTP %{http_code}\n" \
https://app.elaborapro.com/compras_v3.php

echo
echo "=============================================="
echo " OK - ElaboraPro Compras V4.11.2 instalado"
echo " Respaldo: /home/iotcuboc/pyme/$B"
echo "=============================================="
