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

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

cp -p "$FILE" "$BACKUP"

# remove old runtime master patch if present
perl -0pi -e 's@/\* __masterMixerRuntimePatchV1.*?\n\)\(\);\n@@sg' "$FILE"

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

/* __masterMixerRuntimePatchV2
   Build MASTER by cloning MEDIA strip so the design/alignment stays identical.
*/
(function(){
  if (window.__masterMixerRuntimePatchV2) return;
  window.__masterMixerRuntimePatchV2 = 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 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 ensureMasterCss(){
    if (document.getElementById('__masterMixerCssV2')) return;
    var st = document.createElement('style');
    st.id = '__masterMixerCssV2';
    st.textContent = [
      '[data-ch="master"] .chName,[data-ch="master"] .name,[data-ch="master"] .stripLabel{color:#ffd089 !important;}',
      '[data-ch="master"] input[type="range"]{accent-color:#d08a2f;}',
      '[data-ch="master"] .btn.on{box-shadow:inset 0 0 0 1px rgba(208,138,47,.55);}',
      '[data-ch="master"] .meter .led.on,[data-ch="master"] .led.on{filter:saturate(1.15) brightness(1.05);}',
      '[data-ch="master"] .masterSub{opacity:.72;font-size:10px;letter-spacing:.08em;}'
    ].join('\n');
    document.head.appendChild(st);
  }

  function getMixerRoot(){
    return document.querySelector(
      '#audioMixer,' +
      '#mixer,' +
      '.audioMixer,' +
      '.mixer,' +
      '.mixerWrap,' +
      '.mixerGrid,' +
      '.panelBody .mixer,' +
      '.tabPanel .mixer,' +
      '.bankBody .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 markMasterElements(strip){
    strip.setAttribute('data-ch', 'master');
    strip.classList.add('mixerStrip--master');

    strip.querySelectorAll('[id]').forEach(function(el){
      el.removeAttribute('id');
    });

    strip.querySelectorAll('[data-ch],[data-channel]').forEach(function(el){
      el.setAttribute('data-ch', 'master');
      el.setAttribute('data-channel', 'master');
    });

    var title =
      strip.querySelector('.chName,.name,.stripLabel,.title,.label');
    if (title) title.textContent = 'MASTER';

    var sub = strip.querySelector('.chSub,.sub,.meta,.masterSub');
    if (sub) {
      sub.textContent = 'BUS';
      sub.classList.add('masterSub');
    } else if (title && title.parentNode) {
      var d = document.createElement('div');
      d.className = 'masterSub';
      d.textContent = 'BUS';
      title.parentNode.appendChild(d);
    }

    var muteBtn = strip.querySelector('button[title*="Mute"], button[title="Mute"], .btn:last-child, .chBtns .btn');
    if (muteBtn) {
      muteBtn.setAttribute('data-master-mute', '1');
      muteBtn.setAttribute('title', 'Master Mute');
      muteBtn.textContent = 'M';
    }

    var range = strip.querySelector('input[type="range"]');
    if (range) {
      range.setAttribute('data-master-fader', '1');
      range.setAttribute('min', '0');
      range.setAttribute('max', '1.5');
      range.setAttribute('step', '0.01');
      range.value = String(masterState.volume);
    }

    return strip;
  }

  function cloneMediaStrip(){
    var root = getMixerRoot();
    if (!root) return null;

    var media = getMediaStrip(root);
    if (!media) return null;

    var clone = media.cloneNode(true);
    return markMasterElements(clone);
  }

  function insertAfter(refNode, newNode){
    if (!refNode || !refNode.parentNode || !newNode) return;
    if (refNode.nextSibling) refNode.parentNode.insertBefore(newNode, refNode.nextSibling);
    else refNode.parentNode.appendChild(newNode);
  }

  function ensureMasterStrip(){
    ensureMasterCss();

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

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

    var media = getMediaStrip(root);
    if (!media) return null;

    var master = cloneMediaStrip();
    if (!master) return null;

    insertAfter(media, master);
    return master;
  }

  function refreshMasterStrip(){
    var root = getMixerRoot();
    if (!root) return;

    var strip = ensureMasterStrip();
    if (!strip) return;

    computeMasterLevel();

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

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

    var pctNode = strip.querySelector('.masterValue,.chVal,.value,.val');
    if (pctNode) pctNode.textContent = Math.round(masterState.volume * 100) + '%';

    var ledOnCount = Math.round(masterState.level * 20);
    var leds = strip.querySelectorAll('.led');
    if (leds && leds.length) {
      leds.forEach(function(led, idx){
        var turnOn = idx >= (leds.length - ledOnCount);
        led.classList.toggle('on', !!turnOn);
      });
    }
  }

  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 > 240) clearInterval(t);
  }, 500);
})();
JS

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