from pathlib import Path
import re,json,sys,shutil,math
R=Path(__file__).resolve().parent;sys.path.insert(0,str(R.parent/'parity_metadata_closure_A22'));from prepare_candidates import forms
P=R/'board/led_driver.kicad_pcb';shutil.copy2(P,R/'raw_import_board.kicad_pcb');s=P.read_text();pre=(R/'pre_import_board.kicad_pcb').read_text();d=json.loads((R/'import_drc.json').read_text());points=json.loads((R/'fanout_points.json').read_text())
dang={ (round(i['pos']['x'],5),round(i['pos']['y'],5)) for v in d['violations'] if v['type']=='via_dangling' for i in v['items']}
remove_rows=[r for r in points if tuple(round(x,5) for x in r['escape_via']) in dang or r['net'].startswith('unconnected-')]
removed=[];widened=0
for tag in ['segment','via']:
 for st,en,t in reversed(list(forms(s,tag))):
  net=re.search(r'\(net "([^"]+)"',t)[1];rm=False
  if tag=='via':
   xy=tuple(map(float,re.search(r'\(at ([\d.-]+) ([\d.-]+)',t).groups()));rm=any(net==r['net'] and math.dist(xy,r['escape_via'])<.00001 for r in remove_rows)
  else:
   a=tuple(map(float,re.search(r'\(start ([\d.-]+) ([\d.-]+)',t).groups()));b=tuple(map(float,re.search(r'\(end ([\d.-]+) ([\d.-]+)',t).groups()))
   if math.dist(a,b)<.000001:rm=True
   if '(locked yes)' in t:
    rm=rm or any(net==r['net'] and (math.dist(a,r['pad'])<.00001 or math.dist(b,r['escape_via'])<.00001) for r in remove_rows)
   if not rm:
    w=float(re.search(r'\(width ([\d.-]+)',t)[1])
    if w<.199999:t=re.sub(r'\(width [\d.-]+\)','(width 0.2)',t,1);widened+=1
  if rm:removed.append(t);s=s[:st]+s[en:]
  else:s=s[:st]+t+s[en:]
P.write_text(s);(R/'removed_unused_fanout.txt').write_text('\n'.join(removed));(R/'cleanup.json').write_text(json.dumps({'removed_unused_fanout_rows':len(remove_rows),'removed_copper_items':len(removed),'widened_sub_0p2_tracks':widened},indent=2));print('removed',len(removed),'widened',widened)
