#!/bin/bash
# ---------------------------------------------------------------------------
# RidinFamily — Patch du module Splash 2.21.0 pour Dolibarr 23 + MySQL strict.
#
# Corrige deux bugs qui empêchent toute resynchronisation d'une commande
# contenant des lignes sans produit (frais de gestion, remises, livraison) :
#
#  1) BaseItemsTrait::setItemProductLink()
#     setValueFrom() sans $format écrit en 'text' : fk_product = ''.
#     La base est en STRICT_TRANS_TABLES -> "Incorrect integer value: ''".
#     Correctif : forcer le format 'int' (null devient 0, valeur acceptée).
#
#  2) Order\ItemsTrait::deleteItem()
#     Force le brouillon via ->statut (propriété dépréciée), alors que
#     Commande::deleteLine() de Dolibarr 23 teste ->status.
#     -> "Supprimer une ligne n'est pas autorisée par l'état actuel".
#     Correctif : positionner aussi ->status.
#
# Usage :  ./patch_splash_dolibarr23.sh            # vérification seule
#          ./patch_splash_dolibarr23.sh --apply    # sauvegarde + application
# ---------------------------------------------------------------------------
set -euo pipefail

BASE="$HOME/ridin/dolibarr/htdocs/custom/splash"
F1="$BASE/src/Core/BaseItemsTrait.php"
F2="$BASE/src/Objects/Order/ItemsTrait.php"
APPLY="${1:-}"

OLD1='$this->currentItem->setValueFrom("fk_product", $productId, '"''"', null, '"''"', '"''"', "none");'
NEW1='$this->currentItem->setValueFrom("fk_product", $productId, '"''"', null, '"'int'"', '"''"', "none");'

OLD2='        $this->object->statut = 0;'
NEW2='        $this->object->statut = 0;
        $this->object->status = 0;'

for f in "$F1" "$F2"; do
  [ -f "$f" ] || { echo "ABSENT : $f"; exit 1; }
done

echo "=== Etat actuel ==="
grep -q "setValueFrom(\"fk_product\", \$productId, '', null, 'int'" "$F1" \
  && echo "  BaseItemsTrait  : déjà patché" || echo "  BaseItemsTrait  : NON patché"
grep -q 'this->object->status = 0;' "$F2" \
  && echo "  Order/ItemsTrait: déjà patché" || echo "  Order/ItemsTrait: NON patché"

if [ "$APPLY" != "--apply" ]; then
  echo
  echo "Vérification seule. Relancer avec --apply pour sauvegarder et patcher."
  exit 0
fi

TS=$(date +%Y%m%d-%H%M%S)
BAK="$HOME/_modbak_splash_$TS"
mkdir -p "$BAK/Core" "$BAK/Order"
cp "$F1" "$BAK/Core/BaseItemsTrait.php"
cp "$F2" "$BAK/Order/ItemsTrait.php"
echo "Sauvegarde : $BAK"

php -r '
$f = $argv[1];
$src = file_get_contents($f);
$old = "\$this->currentItem->setValueFrom(\"fk_product\", \$productId, \x27\x27, null, \x27\x27, \x27\x27, \"none\");";
$new = "\$this->currentItem->setValueFrom(\"fk_product\", \$productId, \x27\x27, null, \x27int\x27, \x27\x27, \"none\");";
if (strpos($src, $new) !== false) { echo "  BaseItemsTrait  : déjà patché\n"; exit(0); }
if (substr_count($src, $old) !== 1) { fwrite(STDERR, "ARRET : motif introuvable ou multiple dans $f\n"); exit(1); }
file_put_contents($f, str_replace($old, $new, $src));
echo "  BaseItemsTrait  : patché\n";
' "$F1"

php -r '
$f = $argv[1];
$src = file_get_contents($f);
if (strpos($src, "\$this->object->status = 0;") !== false) { echo "  Order/ItemsTrait: déjà patché\n"; exit(0); }
$old = "        \$this->object->statut = 0;\n";
$new = "        \$this->object->statut = 0;\n        \$this->object->status = 0;\n";
if (substr_count($src, $old) !== 1) { fwrite(STDERR, "ARRET : motif introuvable ou multiple dans $f\n"); exit(1); }
file_put_contents($f, str_replace($old, $new, $src));
echo "  Order/ItemsTrait: patché\n";
' "$F2"

echo "=== Lint ==="
php -l "$F1" && php -l "$F2"
echo "OK — resynchroniser la commande #58808 pour valider."
