from pathlib import Path
import sys,re,shutil,json
R=Path(__file__).resolve().parent;B=R.parent;sys.path.insert(0,str(B/'parity_metadata_closure_A22'))
from prepare_candidates import forms,run,sha
from align_and_verify import footprint_rows,netlist
S=B/'drill_interface_A31/controller_candidate';D=R/'controller';D.mkdir(exist_ok=True);OLD='drill_control_evt_a2_paired';NEW='drill_control_evt_a3_pf0_sleep'
for n in ['Project.kicad_sym','sym-lib-table']:shutil.copyfile(S/n,D/n)
shutil.copyfile(S/(OLD+'.kicad_pro'),D/(NEW+'.kicad_pro'))
s=(S/(OLD+'.kicad_sch')).read_text().replace('(project "'+OLD+'"','(project "'+NEW+'"')
for tag in ['wire','label','no_connect']:
 for st,en,x in reversed(list(forms(s,tag))):
  if tag=='wire' and '203.2 129.54' in x:x=x.replace('129.54','119.38')
  elif tag=='label' and '195.58 129.54' in x:x=x.replace('129.54','119.38')
  elif tag=='no_connect' and '203.2 119.38000000000001' in x:x=x.replace('119.38000000000001','129.54')
  s=s[:st]+x+s[en:]
(D/(NEW+'.kicad_sch')).write_text(s)
s=(S/(OLD+'.kicad_pcb')).read_text()
for st,en,x,ref,_ in footprint_rows(s):
 if ref!='U1':continue
 for ps,pe,p in reversed(list(forms(x,'pad'))):
  if p.startswith('(pad "3"'):p=p.replace('/DRV_SLEEP_N','unconnected-(U1-PC14-Pad3)')
  elif p.startswith('(pad "5"'):p=p.replace('unconnected-(U1-PF0-Pad5)','/DRV_SLEEP_N')
  x=x[:ps]+p+x[pe:]
 s=s[:st]+x+s[en:];break
for tag in ['segment','via']:
 for st,en,x in reversed(list(forms(s,tag))):
  if '61a728a0-2b3e-455c-8e91-eae8c7a2a650' in x :x=x.replace('51.425','52.425')

  s=s[:st]+x+s[en:]
import uuid
x='(segment (start 85.1568 52.425) (end 85.1568 51.425) (width 0.2) (layer "F.Cu") (net "/DRV_SLEEP_N") (uuid "%s"))'%uuid.uuid5(uuid.NAMESPACE_URL,'A32:sleepstub')
s=s.rstrip()[:-1]+'\n'+x+'\n)\n'
(D/(NEW+'.kicad_pcb')).write_text(s)
for a,n in [(['sch','export','netlist','--format','kicadxml','--output',str(D/'netlist.xml'),str(D/(NEW+'.kicad_sch'))],'netlist.log'),(['sch','erc','--format','json','--output',str(D/'erc.json'),str(D/(NEW+'.kicad_sch'))],'erc.log'),(['pcb','drc','--format','json','--refill-zones','--save-board','--schematic-parity','--output',str(D/'drc.json'),str(D/(NEW+'.kicad_pcb'))],'drc.log')]:assert run(a,D/n)==0
_,a=netlist(S/'netlist.xml');_,b=netlist(D/'netlist.xml');print('pin diffs',[(k,a[k],b.get(k)) for k in a if a[k]!=b.get(k)])
d=json.loads((D/'drc.json').read_text());e=json.loads((D/'erc.json').read_text());print(json.dumps({'DRC':d['violations'],'unconnected':d['unconnected_items'],'parity':d['schematic_parity'],'ERC':[v for x in e['sheets'] for v in x['violations']]},indent=2))
