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

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

cp -p "$FILE" "$BACKUP"

if grep -q '__masterMixerRuntimePatchV1' "$FILE"; then
  echo "Master mixer patch already present."
  exit 0
fi

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

/* __masterMixerRuntimePatchV1
   Adds a MASTER strip after Media without rewriting existing mixer internals.
*/
(function(){
  if (window.__masterMixerRuntimePatchV1) return;
  window.__masterMixerRuntimePatchV1 = true;

  var masterState = {
    volume: 1,
    muted: false,
    level: 0
  };

  try {
    var mv = parseFloat(localStorage.getItem('coproducer_master_volume_v1') || '1');
    if (Number.isFinite(mv)) masterState.volume = Math.max(0, Math.min(1.5, mv));
  } catch(_) {}

  try {
    masterState.muted = localStorage.getItem('coproducer_master_muted_v1') === '1';
  } catch(_) {}

  function saveMasterState(){
    try { localStorage.setItem('coproducer_master_volume_v1', String(masterState.volume)); } catch(_){}
    try { localStorage.setItem('coproducer_master_muted_v1', masterState.muted ? '1' : '0'); } catch(_){}
  }

  function ensureMasterCss(){
    if (document.getElementById('__masterMixerCssV1')) return;
    var st = document.createElement('style');
    st.id = '__masterMixerCssV1';
    st.textContent = [
      '.mixerStrip--master .chName,.mixerStrip--master .name,.mixerStrip--master .stripLabel{color:#ffd089 !important;}',
      '.mixerStrip--master [data-master-fader="1"]{accent-color:#d08a2f;}',
      '.mixerStrip--master .led.on{filter:saturate(1.15) brightness(1.05);}',
      '.mixerStrip--master .btn{min-width:32px;}',
      '.mixerStrip--master .masterSub{font-size:10px;opacity:.72;letter-spacing:.08em;}',
      '.mixerStrip--master .masterValue{font-size:11px;opacity:.85;text-align:center;margin-top:6px;}'
    ].join('\n');
    document.head.appendChild(st);
  }

  function clamp(v, min, max){
    v = Number(v);
    if (!Number.isFinite(v)) v = min;
    if (v < min) v = min;
    if (v > max) v = max;
    return v;
  }

  function computeMasterLevel(){
    var sum = 0;
    var count = 0;

    try {
      if (typeof slots !== 'undefined' && Array.isArray(slots)) {
        for (var i = 0; i < slots.length; i++) {
          var s = slots[i];
          if (!s) continue;
          var hear = (s.micMonitorOn !== false);
          var lvl = Number(s._meterLevel || s.meter || s.level || 0) || 0;
          if (hear) {
            sum += lvl;
            count++;
          }
        }
      }
    } catch(_) {}

    try {
      if (typeof mediaState !== 'undefined' && mediaState) {
        var mediaLvl = Number(mediaState._meterLevel || mediaState.meter || mediaState.level || 0) || 0;
        var mediaAudible = !mediaState.muted;
        if (mediaAudible) {
          sum += mediaLvl;
          count++;
        }
      }
    } catch(_) {}

    var avg = count > 0 ? (sum / count) : 0;
    avg = clamp(avg, 0, 1);
    masterState.level = masterState.muted ? 0 : clamp(avg * masterState.volume, 0, 1);
    return masterState.level;
  }

  function getMixerRoot(){
    return document.querySelector(
      '#audioMixer,' +
      '#mixer,' +
      '.audioMixer,' +
      '.mixer,' +
      '.mixerWrap,' +
      '.mixerGrid,' +
      '.panelBody .mixer'
    );
  }

  function getMediaStrip(root){
    if (!root) return null;
    return root.querySelector(
      '[data-ch="media"],' +
      '[data-channel="media"],' +
      '.mixerStrip--media,' +
      '.ch.media,' +
      '.strip.media'
    );
  }

  function getMasterStrip(root){
    if (!root) return null;
    return root.querySelector('[data-ch="master"]');
  }

  function makeMeterHtml(level){
    var html = '';
    for (var i = 0; i < 20; i++) {
      var threshold = (20 - i) / 20;
      var on = level >= threshold;
      html += '<span class="led ' + (on ? 'on' : '') + '"></span>';
    }
    return html;
  }

  function buildMasterStrip(){
    var wrap = document.createElement('div');
    wrap.className = 'ch mixerStrip mixerStrip--master';
    wrap.setAttribute('data-ch', 'master');

    wrap.innerHTML = [
      '<div class="chHead">',
        '<div class="chName">MASTER</div>',
        '<div class="masterSub">BUS</div>',
      '</div>',
      '<div class="meter masterMeter" data-master-meter="1">',
        '<div class="ledStack">', makeMeterHtml(masterState.level), '</div>',
      '</div>',
      '<div class="faderWrap">',
        '<input type="range" min="0" max="1.5" step="0.01" value="', String(masterState.volume), '" data-master-fader="1" orient="vertical">',
      '</div>',
      '<div class="chBtns">',
        '<button class="btn ', (masterState.muted ? '' : 'on'), '" data-master-mute="1" aria-pressed="', (masterState.muted ? 'false' : 'true'), '" title="Master Mute">M</button>',
      '</div>',
      '<div class="masterValue" data-master-value="1">', Math.round(masterState.volume * 100), '%</div>'
    ].join('');

    return wrap;
  }

  function ensureMasterStrip(){
    ensureMasterCss();

    var root = getMixerRoot();
    if (!root) return null;

    var existing = getMasterStrip(root);
    if (existing) return existing;

    var masterStrip = buildMasterStrip();
    var mediaStrip = getMediaStrip(root);

    if (mediaStrip && mediaStrip.parentNode) {
      if (mediaStrip.nextSibling) mediaStrip.parentNode.insertBefore(masterStrip, mediaStrip.nextSibling);
      else mediaStrip.parentNode.appendChild(masterStrip);
    } else {
      root.appendChild(masterStrip);
    }

    return masterStrip;
  }

  function refreshMasterStrip(){
    var strip = ensureMasterStrip();
    if (!strip) return;

    var level = computeMasterLevel();

    var stack = strip.querySelector('.ledStack');
    if (stack) stack.innerHTML = makeMeterHtml(level);

    var btn = strip.querySelector('[data-master-mute="1"]');
    if (btn) {
      btn.classList.toggle('on', !masterState.muted);
      btn.setAttribute('aria-pressed', masterState.muted ? 'false' : 'true');
    }

    var fader = strip.querySelector('[data-master-fader="1"]');
    if (fader && String(fader.value) !== String(masterState.volume)) {
      fader.value = String(masterState.volume);
    }

    var val = strip.querySelector('[data-master-value="1"]');
    if (val) val.textContent = Math.round(masterState.volume * 100) + '%';
  }

  document.addEventListener('input', function(ev){
    var el = ev.target;
    if (!el || !el.matches || !el.matches('[data-master-fader="1"]')) return;
    masterState.volume = clamp(el.value, 0, 1.5);
    saveMasterState();
    refreshMasterStrip();
  }, true);

  document.addEventListener('click', function(ev){
    var btn = ev.target && ev.target.closest ? ev.target.closest('[data-master-mute="1"]') : null;
    if (!btn) return;
    ev.preventDefault();
    masterState.muted = !masterState.muted;
    saveMasterState();
    refreshMasterStrip();
  }, true);

  function boot(){
    ensureMasterCss();
    ensureMasterStrip();
    refreshMasterStrip();
  }

  if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', boot, { once:true });
  } else {
    boot();
  }

  var tries = 0;
  var t = setInterval(function(){
    refreshMasterStrip();
    tries++;
    if (tries > 200) clearInterval(t);
  }, 500);
})();
JS

echo "Backup: $BACKUP"
echo
echo "Verification:"
grep -n '__masterMixerRuntimePatchV1\|data-master-fader\|data-master-mute\|mixerStrip--master' "$FILE" || true
