with open('/tmp/inquiry.html','r',encoding='utf-8') as f:
    h = f.read()

# Fix: remove mindmap from D3 tag
import re
bad_start = h.find('<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/7.8.5/d3.min.js">')
bad_end = h.find('</script>', bad_start) + len('</script>')
correct_d3_tag = '<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/7.8.5/d3.min.js"></script>'
h = h[:bad_start] + correct_d3_tag + h[bad_end:]

MINDMAP_JS = r'''
// ─── Seller Mindmap ────────────────────────────────────────────────────────
function renderSellerMindmap(sellerName, d1, d2){
  var out=document.getElementById('outcome');
  var sd=(window.SELLER_DATA||{})[sellerName];
  if(!sd){
    out.innerHTML='<div id="outcome-inner" style="text-align:center;color:#0055aa;font-size:22px;padding:60px;">查無賣家資料：'+sellerName+'</div>';
    return;
  }

  // Date filter: YYYYMMDD integers
  var d1i=d1?parseInt(d1.replace(/-/g,'')):0;
  var d2i=d2?parseInt(d2.replace(/-/g,'')):99991231;

  var bAmt={},bDaysSum={},bDaysCnt={};
  (sd.afh.tx||[]).forEach(function(tx){
    if(tx[1]<d1i||tx[1]>d2i) return;
    var n=sd.afh.buyers[tx[0]];
    if(!bAmt[n]){bAmt[n]=0;bDaysSum[n]=0;bDaysCnt[n]=0;}
    bAmt[n]+=tx[2];
    if(tx[3]>0){bDaysSum[n]+=tx[3];bDaysCnt[n]++;}
  });

  var histBuyers=Object.keys(bAmt).map(function(n){
    return{name:n,total:bAmt[n],
      avgDays:bDaysCnt[n]>0?(bDaysSum[n]/bDaysCnt[n]).toFixed(1):null};
  }).sort(function(a,b){return b.total-a.total;});

  var totalHistAmt=histBuyers.reduce(function(s,b){return s+b.total;},0);
  var allDaysSum=Object.keys(bDaysSum).reduce(function(s,k){return s+bDaysSum[k];},0);
  var allDaysCnt=Object.keys(bDaysCnt).reduce(function(s,k){return s+bDaysCnt[k];},0);
  var overallAvgDays=allDaysCnt>0?(allDaysSum/allDaysCnt).toFixed(1):null;

  // Layout constants
  var SW=600,SH=75,FW=148,FH=42,BW=190,BH=78;
  var CLW=162,CLH=42,APW=162,APH=42;
  var BRW=195,BRH=52,DWW=152,DWH=38;
  var HG=38,VG=16,PAD_T=58,PAD_B=36,PAD_L=18,PAD_R=18,HDR_H=26;

  // Flatten WL rows
  var leftRows=[];
  (sd.wl.factories||[]).forEach(function(f){
    f.buyers.forEach(function(b,bi){
      leftRows.push({factory:f.loc,buyer:b.name,cr:b.cr,country:b.country,
        sector:b.sector,cl:b.cl,ap:b.ap});
    });
  });

  var nLeft=leftRows.length,nRight=histBuyers.length;
  var nRows=Math.max(nLeft,nRight,1);
  var rowH=Math.max(BH,CLH,APH,BRH,DWH)+VG;

  // X column centers
  var apcx =PAD_L+APW/2;
  var clcx =apcx+APW/2+HG+CLW/2;
  var bcx  =clcx+CLW/2+HG+BW/2;
  var fcx  =bcx+BW/2+HG+FW/2;
  var scx  =fcx+FW/2+HG+SW/2;
  var brcx =scx+SW/2+HG+BRW/2;
  var drcx =brcx+BRW/2+HG+DWW/2;
  var svgW =(nRight>0?drcx+DWW/2:scx+SW/2)+PAD_R;

  var contentH=nRows*rowH-VG;
  var svgH=PAD_T+contentH+PAD_B;

  function rowCY(i){return PAD_T+i*rowH+rowH/2;}
  var sCY=(rowCY(0)+rowCY(nRows-1))/2;

  // SVG helpers
  var ns='http://www.w3.org/2000/svg';
  function mk(tag,attr,par){
    var el=document.createElementNS(ns,tag);
    for(var k in attr) el.setAttribute(k,attr[k]);
    if(par) par.appendChild(el);
    return el;
  }
  function addRect(par,cx,cy,w,h,fill,stroke,sw,rx){
    return mk('rect',{x:cx-w/2,y:cy-h/2,width:w,height:h,rx:rx!==undefined?rx:6,
      fill:fill,stroke:stroke||fill,'stroke-width':sw||1},par);
  }
  function addText(par,x,y,text,fill,fz,bold){
    var el=mk('text',{x:x,y:y,'text-anchor':'middle','dominant-baseline':'middle',
      fill:fill||'#000','font-size':fz||'12px','font-weight':bold?'bold':'normal'},par);
    el.textContent=text; return el;
  }
  function addLine(par,x1,y1,x2,y2,col,sw){
    return mk('line',{x1:x1,y1:y1,x2:x2,y2:y2,stroke:col||'#003366','stroke-width':sw||1.5},par);
  }
  function addBez(par,x1,y1,x2,y2,col,sw){
    var mx=(x1+x2)/2;
    return mk('path',{d:'M'+x1+','+y1+' C'+mx+','+y1+' '+mx+','+y2+' '+x2+','+y2,
      fill:'none',stroke:col||'#003366','stroke-width':sw||1.8},par);
  }
  function trunc(s,n){return s&&s.length>n?s.slice(0,n-1)+'\u2026':s||'';}
  function fmtAmt(v){
    if(!v&&v!==0) return '\u2014';
    if(v>=1e9) return '$'+(v/1e9).toFixed(2)+'B';
    if(v>=1e6) return '$'+(v/1e6).toFixed(2)+'M';
    if(v>=1e3) return '$'+(v/1e3).toFixed(1)+'K';
    return '$'+Math.round(v).toLocaleString();
  }

  // Create SVG container
  out.innerHTML='<div id="seller-mindmap" style="width:100%;overflow-x:auto;overflow-y:auto;background:#ACD6FF;padding:16px 8px;box-sizing:border-box;min-height:200px;"></div>';
  var svg=mk('svg',{width:svgW,height:svgH,style:'background:#ACD6FF;display:block;'},
    document.getElementById('seller-mindmap'));

  // Column headers
  var hdrY=PAD_T/2;
  function hdrBox(x,y,w,text,fill){
    addRect(svg,x,y,w,HDR_H,fill,fill,0,5);
    addText(svg,x,y,text,'white','11px',true);
  }
  if(nLeft>0){
    hdrBox(clcx,hdrY,CLW,'Total CL: '+fmtAmt(sd.wl.totalCL),'#b08820');
    hdrBox(apcx,hdrY,APW,'Total AP(WL): '+fmtAmt(sd.wl.totalAP),'#b04818');
  }
  if(nRight>0){
    hdrBox(brcx,hdrY,BRW,'Total Purchased: '+fmtAmt(totalHistAmt),'#0055aa');
    if(overallAvgDays) hdrBox(drcx,hdrY,DWW,'Overall Avg: '+overallAvgDays+' days','#2d8855');
  }

  // Seller box (600x75, 20px bold white)
  addRect(svg,scx,sCY,SW,SH,'#003366','#001d3d',2,8);
  addText(svg,scx,sCY,trunc(sellerName,42),'white','20px',true);

  // Left tree: factory map
  var factoryMap={};
  leftRows.forEach(function(r,ri){
    if(!factoryMap[r.factory]) factoryMap[r.factory]={rows:[]};
    factoryMap[r.factory].rows.push(ri);
  });

  // Draw left rows
  leftRows.forEach(function(r,ri){
    var cy=rowCY(ri);
    // AP — orange
    addRect(svg,apcx,cy,APW,APH,'#e87722','#c05520',1,5);
    addText(svg,apcx,cy-10,'Amount Purchased','white','10px');
    addText(svg,apcx,cy+10,fmtAmt(r.ap),'white','13px',true);
    // CL — gold
    addRect(svg,clcx,cy,CLW,CLH,'#f0c040','#c09830',1,5);
    addText(svg,clcx,cy-10,'Credit Limit','#444','10px');
    addText(svg,clcx,cy+10,fmtAmt(r.cl),'#222','13px',true);
    // Buyer — white/dark blue
    addRect(svg,bcx,cy,BW,BH,'white','#003366',1.5,6);
    addText(svg,bcx,cy-20,trunc(r.buyer,22),'#003366','11.5px',true);
    addText(svg,bcx,cy,'CR: '+r.cr+'  |  '+r.country,'#445566','10.5px');
    addText(svg,bcx,cy+20,trunc(r.sector,26),'#667788','10px');
    // Connectors
    addLine(svg,apcx+APW/2,cy,clcx-CLW/2,cy);
    addLine(svg,clcx+CLW/2,cy,bcx-BW/2,cy);
  });

  // Draw factories
  var drawnF={};
  leftRows.forEach(function(r){
    if(drawnF[r.factory]) return;
    drawnF[r.factory]=true;
    var fg=factoryMap[r.factory];
    var topCY=rowCY(fg.rows[0]),botCY=rowCY(fg.rows[fg.rows.length-1]);
    var fcy=(topCY+botCY)/2;
    var fh=Math.max(FH,botCY-topCY+BH+4);
    addRect(svg,fcx,fcy,FW,fh,'#0066CC','#004499',1.5,7);
    var fl=r.factory||'\u2014';
    if(fl.length<=17){
      addText(svg,fcx,fcy,trunc(fl,20),'white','11px',true);
    } else {
      var sp=fl.lastIndexOf(' ',Math.floor(fl.length/2)+4);
      if(sp<1) sp=Math.floor(fl.length/2);
      addText(svg,fcx,fcy-9,trunc(fl.slice(0,sp),20),'white','10.5px',true);
      addText(svg,fcx,fcy+9,trunc(fl.slice(sp+1),20),'white','10.5px',true);
    }
    addBez(svg,fcx+FW/2,fcy,scx-SW/2,sCY,'#003366',1.8);
    fg.rows.forEach(function(ri2){
      addLine(svg,fcx-FW/2,rowCY(ri2),bcx+BW/2,rowCY(ri2),'#003366',1.5);
    });
  });

  // Right tree (AFH history buyers)
  histBuyers.forEach(function(b,ri){
    var cy=rowCY(ri);
    addRect(svg,brcx,cy,BRW,BRH,'white','#003366',1.5,6);
    addText(svg,brcx,cy-14,trunc(b.name,24),'#003366','11.5px',true);
    addText(svg,brcx,cy+11,fmtAmt(b.total),'#e87722','13px',true);
    if(b.avgDays){
      addRect(svg,drcx,cy,DWW,DWH,'#44aa66','#2d8855',1,5);
      addText(svg,drcx,cy-9,'Avg Business Days','white','10px');
      addText(svg,drcx,cy+9,b.avgDays+' days','white','12px',true);
      addLine(svg,brcx+BRW/2,cy,drcx-DWW/2,cy,'#003366',1.5);
    }
    addBez(svg,scx+SW/2,sCY,brcx-BRW/2,cy,'#0055aa',1.8);
  });
}
// ─── End Seller Mindmap ────────────────────────────────────────────────────
'''

# Inject before the MAIN script closing tag (before </script>\n</body>)
target = '</script>\n</body>'
if target in h:
    h = h.replace(target, MINDMAP_JS + '\n</script>\n</body>', 1)
    print("✓ Mindmap JS injected at correct location")
else:
    # Try alternative
    target2 = '</script>\n</body>\n</html>'
    if target2 in h:
        h = h.replace(target2, MINDMAP_JS + '\n</script>\n</body>\n</html>', 1)
        print("✓ Mindmap JS injected (alt)")
    else:
        # Last resort - find last </script>
        idx = h.rfind('</script>')
        h = h[:idx] + MINDMAP_JS + '\n</script>' + h[idx+len('</script>'):]
        print("✓ Mindmap JS injected at last </script>")

# Also update doClear to properly reset outcome after mindmap
old_clear_reset = "document.getElementById('outcome-inner').textContent='\u2191 請於上方選擇條件後進行查詢';\n  // 移除心智圖\n  var mm=document.getElementById('seller-mindmap');if(mm)mm.remove();"
new_clear_reset = """var outEl=document.getElementById('outcome');
  if(outEl) outEl.innerHTML='<div id="outcome-inner" style="text-align:center;color:#0055aa;font-size:20px;opacity:.5;padding:20px;">\u2191 請於上方選擇條件後進行查詢</div>';"""
if old_clear_reset in h:
    h = h.replace(old_clear_reset, new_clear_reset)
    print("✓ doClear updated")
else:
    print("⚠ doClear pattern not found exactly — checking...")
    import re
    m = re.search(r"outcome-inner.*?textContent.*?查詢", h, re.DOTALL)
    if m: print("Found at:", m.start(), repr(m.group()[:100]))

# Save
with open('/tmp/inquiry.html','w',encoding='utf-8') as f:
    f.write(h)

import shutil
shutil.copy('/tmp/inquiry.html','/root/.openclaw-cooper/workspace/inquiry/inquiry.html')

# Verify
checks = [
    ('D3.js CDN correct', '<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/7.8.5/d3.min.js"></script>' in h),
    ('SELLER_DATA', 'var SELLER_DATA' in h),
    ('renderSellerMindmap function', 'function renderSellerMindmap' in h),
    ('doExecute call', 'renderSellerMindmap(s,d1,d2)' in h),
    ('SVG bezier', 'addBez' in h),
    ('mindmap NOT in D3 tag', h.find('function renderSellerMindmap') > h.find('</head>')),
]
for name, result in checks:
    print(f"  {'✓' if result else '✗'} {name}")
print(f"  File size: {len(h)//1024} KB")
