#!/usr/bin/env bash
set -euo pipefail

FILE="assets/js/modules/coproducer.inline-main.js"
BACKUP="${FILE}.bak_master_stabilize_$(date +%Y%m%d_%H%M%S)"

cp -p "$FILE" "$BACKUP"

if grep -q '__masterMixerRenderHookV1' "$FILE"; then
  echo "Master render hook already present."
  exit 0
fi

cat >> "$FILE" <<'JS'

/* __masterMixerRenderHookV1
   Stabilize MASTER by reapplying immediately after native mixer rerenders.
*/
(function(){
  if (window.__masterMixerRenderHookV1) return;
  window.__masterMixerRenderHookV1 = true;

  function reapplyMasterSoon(){
    try {
      setTimeout(function(){
        try {
          if (typeof window.__masterMixerFinalSinglePatchV1 !== 'undefined') {
            var row = document.getElementById('stripRow');
            if (!row) return;

            // remove any stray non-row master widgets again, just in case
            document.querySelectorAll('[data-ch="master"], .mixerStrip--master, .ch[data-ch="master"]').forEach(function(el){
              if (el.closest && el.closest('#stripRow') && el.classList.contains('strip')) return;
              try { el.remove(); } catch(_){}
            });

            // if the row lost master, fire a synthetic resize/update path by nudging DOM
            var hasMaster = !!document.querySelector('#stripRow > .strip[data-master-strip="1"]');
            if (!hasMaster) {
              try {
                var evt = new Event('input', { bubbles:true });
                document.dispatchEvent(evt);
              } catch(_){}
            }
          }
        } catch(_) {}
      }, 0);
    } catch(_) {}
  }

  // Wrap renderUI if present
  try {
    if (typeof window.renderUI === 'function' && !window.renderUI.__masterWrapped) {
      var __origRenderUI = window.renderUI;
      var __wrappedRenderUI = function(){
        var out = __origRenderUI.apply(this, arguments);
        reapplyMasterSoon();
        return out;
      };
      __wrappedRenderUI.__masterWrapped = true;
      window.renderUI = __wrappedRenderUI;
    }
  } catch(_) {}

  // Observe stripRow mutations directly
  try {
    var tries = 0;
    var wait = setInterval(function(){
      var row = document.getElementById('stripRow');
      if (row && !row.__masterObserverBound) {
        row.__masterObserverBound = true;
        var mo = new MutationObserver(function(){
          reapplyMasterSoon();
        });
        mo.observe(row, { childList:true, subtree:false });
      }
      tries++;
      if (tries > 40 || row) clearInterval(wait);
    }, 250);
  } catch(_) {}
})();
JS

echo "Backup: $BACKUP"
echo
echo "Verification:"
grep -n '__masterMixerRenderHookV1' "$FILE" || true
