from pathlib import Path
import json,sys,re,math,uuid,shutil
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';s=(R/'raw_import_board.kicad_pcb').read_text();d=json.loads((R/'import_drc.json').read_text());ids={i['uuid'] for v in d['violations'] if v['type']=='via_dangling' for i in v['items']};edits=[]
for tag in ['segment','via']:
 for st,en,t in reversed(list(forms(s,tag))):
  net=re.search(r'\(net "([^"]+)"',t)[1]
  if net.startswith('unconnected-') or (tag=='via' and any(i in t for i in ids)):s=s[:st]+s[en:];continue
  if tag=='segment':
   w=float(re.search(r'\(width ([\d.-]+)',t)[1]);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:s=s[:st]+s[en:];continue
   if w<.199999:t=re.sub(r'\(width [\d.-]+\)','(width 0.2)',t,1);s=s[:st]+t+s[en:]
rows=[]
for st,en,t in forms(s,'segment'):
 a=tuple(map(float,re.search(r'\(start ([\d.-]+) ([\d.-]+)',t).groups()));b=tuple(map(float,re.search(r'\(end ([\d.-]+) ([\d.-]+)',t).groups()));net=re.search(r'\(net "([^"]+)"',t)[1];layer=re.search(r'\(layer "([^"]+)"',t)[1];rows.append((st,en,t,a,b,net,layer))
for st,en,t,a,b,net,layer in reversed(rows):
 if '(locked yes)' not in t:continue
 dx,dy=b[0]-a[0],b[1]-a[1];den=dx*dx+dy*dy;points=[(0,a),(1,b)]
 for _,_,ot,oa,ob,on,ol in rows:
  if on!=net or ol!=layer or ot==t:continue
  for xy in [oa,ob]:
   u=((xy[0]-a[0])*dx+(xy[1]-a[1])*dy)/den
   if 0.00001<u<.99999 and math.dist(xy,(a[0]+u*dx,a[1]+u*dy))<.001:points.append((u,xy))
 points=sorted(points);uniq=[]
 for u,xy in points:
  if not uniq or math.dist(uniq[-1][1],xy)>.00001:uniq.append((u,xy))
 if len(uniq)<=2:continue
 adds=[]
 for (_,aa),(_,bb) in zip(uniq,uniq[1:]):adds.append('(segment (start %.6f %.6f) (end %.6f %.6f) (width 0.2) (layer "%s") (net "%s") (uuid "%s"))'%(*aa,*bb,layer,net,str(uuid.uuid4())))
 s=s[:st]+'\n'.join(adds)+s[en:];edits.append({'net':net,'parts':len(adds)})
P.write_text(s);(R/'split_fixed_junctions.json').write_text(json.dumps(edits,indent=2));print('Split trunks',len(edits))
