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

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

cp -p "$FILE" "$BACKUP"

# 1) Remove every previous master-related runtime patch block
perl -0pi -e 's@/\* __masterMixerRuntimePatchV1.*?\n\)\(\);\n@@sg' "$FILE"
perl -0pi -e 's@/\* __masterMixerRuntimePatchV2.*?\n\)\(\);\n@@sg' "$FILE"
perl -0pi -e 's@/\* __masterMixerRuntimePatchV3.*?\n\)\(\);\n@@sg' "$FILE"
perl -0pi -e 's@/\* __masterMixerCleanupAndAlignV1.*?\n\)\(\);\n@@sg' "$FILE"

# 2) Append one final single-source master patch
cat >> "$FILE" <<'JS'

/* __masterMixerFinalSinglePatchV1 */
(function(){
  if (window.__masterMixerFinalSinglePatchV1) return;
  window.__masterMixerFinalSinglePatchV1 = true;

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

  try {
    var mv = parseFloat(localStorage.getItem('coproducer_master_volume_v1') || '80');
    if (Number.isFinite(mv)) masterState.volume = Math.max(0, Math.min(100, 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);
    var volScale = clamp(masterState.volume / 100, 0, 1);
    masterState.level = masterState.muted ? 0 : clamp(avg * volScale, 0, 1);
    return masterState.level;
  }

  function ensureCss(){
    if (document.getElementById('__masterMixerFinalCssV1')) return;
    var st = document.createElement('style');
    st.id = '__masterMixerFinalCssV1';
    st.textContent = [
      '.mixerWrap{overflow-x:auto;overflow-y:hidden;}',
      '#stripRow{display:flex !important;flex-wrap:nowrap !important;align-items:stretch !important;gap:8px !important;}',
      '#stripRow>.strip{flex:1 1 0 !important;min-width:0 !important;width:auto !important;}',
      '#stripRow .strip[data-master-strip="1"] .stripTop b{color:#ffd089 !important;}',
      '#stripRow .strip[data-master-strip="1"] .faderCap{box-shadow:inset 0 0 0 1px rgba(208,138,47,.55),0 0 12px rgba(208,138,47,.18);}',
      '#stripRow .strip[data-master-strip="1"] .vuFill{filter:saturate(1.15) brightness(1.05);}',
      '#stripRow .strip[data-master-strip="1"] .state{opacity:.9;}'
    ].join('\n');
    document.head.appendChild(st);
  }

  function getStripRow(){
    return document.getElementById('stripRow');
  }

  function getMasterStrip(){
    var row = getStripRow();
    return row ? row.querySelector('.strip[data-master-strip="1"]') : null;
  }

  function getBaseStrip(){
    var row = getStripRow();
    if (!row) return null;
    var strips = row.querySelectorAll('.strip');
    if (!strips || !strips.length) return null;
    return strips[strips.length - 1];
  }

  function removeLegacyMasterWidgets(){
    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(_){}
    });
  }

  function capTopFromValue(v){
    var value = clamp(v, 0, 100);
    var maxTravel = 118;
    return Math.round((100 - value) / 100 * maxTravel);
  }

  function buildMasterStrip(){
    var base = getBaseStrip();
    if (!base) return null;

    var clone = base.cloneNode(true);
    clone.id = 'st-master';
    clone.setAttribute('data-master-strip', '1');

    clone.querySelectorAll('[id]').forEach(function(el){
      if (el.classList.contains('state')) el.id = 'st-master-state';
      else if (el.classList.contains('vfader')) el.id = 'f-master';
      else if (el.classList.contains('faderCap')) el.id = 'cap-master';
      else if (el.classList.contains('vuFill')) {
        if (!el.id || /-L$/.test(el.id)) el.id = 'vu-master-L';
        else if (!el.id || /-R$/.test(el.id)) el.id = 'vu-master-R';
        else el.removeAttribute('id');
      } else {
        el.removeAttribute('id');
      }
    });

    var title = clone.querySelector('.stripTop b');
    if (title) title.textContent = 'MASTER';

    var state = clone.querySelector('.state');
    if (state) state.textContent = 'BUS';

    var fader = clone.querySelector('.vfader');
    if (fader) {
      fader.value = String(masterState.volume);
      fader.setAttribute('data-master-fader', '1');
    }

    var cap = clone.querySelector('.faderCap');
    if (cap) cap.style.top = capTopFromValue(masterState.volume) + 'px';

    return clone;
  }

  function ensureSingleMasterStrip(){
    ensureCss();
    removeLegacyMasterWidgets();

    var row = getStripRow();
    if (!row) return null;

    var masters = row.querySelectorAll('.strip[data-master-strip="1"], .strip#st-master');
    if (masters.length > 1) {
      for (var i = 1; i < masters.length; i++) {
        try { masters[i].remove(); } catch(_){}
      }
    }

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

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

    row.appendChild(master);
    return master;
  }

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

    computeMasterLevel();

    var state = strip.querySelector('.state');
    if (state) state.textContent = masterState.muted ? 'MUTED' : 'BUS';

    var fader = strip.querySelector('.vfader');
    if (fader) fader.value = String(masterState.volume);

    var cap = strip.querySelector('.faderCap');
    if (cap) cap.style.top = capTopFromValue(masterState.volume) + 'px';

    var h = Math.round(masterState.level * 100);
    var vuL = strip.querySelector('#vu-master-L');
    var vuR = strip.querySelector('#vu-master-R');
    if (vuL) vuL.style.height = h + '%';
    if (vuR) vuR.style.height = h + '%';
  }

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

  function boot(){
    ensureSingleMasterStrip();
    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 '__masterMixerFinalSinglePatchV1\|__masterMixerRuntimePatchV1\|__masterMixerRuntimePatchV2\|__masterMixerRuntimePatchV3\|__masterMixerCleanupAndAlignV1' "$FILE" || true
