from pathlib import Path
import re,shutil,json,hashlib
P=Path(__file__).resolve().parent;A=P.parent/'drill_cutoff_layout_A86';name='TDK_C3225X7R1H226M250AC_1210_Land'
for fn in ['drill_motor_a85_cutoff.kicad_sch','drill_motor_a85_cutoff.kicad_pro','Project.kicad_sym','sym-lib-table','fp-lib-table']:
 shutil.copyfile(A/fn,P/fn)
shutil.copytree(A/'MotorStage.pretty',P/'MotorStage.pretty',dirs_exist_ok=True)
shutil.copyfile(A/'drill_motor_a85_cutoff.kicad_pcb',P/'baseline-A86.kicad_pcb')
def end_form(s,start):
 depth=0;quoted=False;esc=False
 for i in range(start,len(s)):
  c=s[i]
  if quoted:
   if esc:esc=False
   elif c=='\\':esc=True
   elif c=='"':quoted=False
  elif c=='"':quoted=True
  elif c=='(':depth+=1
  elif c==')':
   depth-=1
   if depth==0:return i+1
 raise ValueError('unbalanced')
def modify(t):
 t=t.replace('(at -1.475 0)','(at -1.65 0)').replace('(at 1.475 0)','(at 1.65 0)').replace('(size 1.15 2.7)','(size 1.1 2.2)').replace('(roundrect_rratio 0.217391)','(roundrect_rratio 0.227273)')
 t=t.replace('(start -2.3 -1.6)','(start -2.45 -1.65)').replace('(end 2.3 1.6)','(end 2.45 1.65)')
 t=t.replace('-0.711252 -1.36','-0.711252 -1.6').replace('0.711252 -1.36','0.711252 -1.6').replace('-0.711252 1.36','-0.711252 1.6').replace('0.711252 1.36','0.711252 1.6')
 while '(model ' in t:
  i=t.index('(model ');j=end_form(t,i);t=t[:i]+t[j:]
 return t
s=(A/'drill_motor_a85_cutoff.kicad_pcb').read_text();edits=[]
for m in re.finditer(r'\(footprint "Capacitor_SMD:C_1210_3225Metric"',s):
 i=m.start();j=end_form(s,i);t=s[i:j];ref=re.search(r'\(property "Reference" "([^"]+)"',t).group(1);assert ref in ['C7','C8']
 u=modify(t).replace('Capacitor_SMD:C_1210_3225Metric','MotorStage:'+name);edits.append((i,j,u,ref))
assert len(edits)==2
for i,j,u,ref in reversed(edits):s=s[:i]+u+s[j:]
(P/'drill_motor_a85_cutoff.kicad_pcb').write_text(s)
f=P/'drill_motor_a85_cutoff.kicad_sch';s=f.read_text();assert s.count('Capacitor_SMD:C_1210_3225Metric')==2;s=s.replace('Capacitor_SMD:C_1210_3225Metric','MotorStage:'+name).replace('A86-LAYOUT-CANDIDATE','A90-CAP-LAND-CANDIDATE').replace('A85 DRILL MOTOR - CPU INDEPENDENT CUTOFF CANDIDATE','A90 DRILL MOTOR - CPU INDEPENDENT CUTOFF CANDIDATE');f.write_text(s)
f=Path('/Applications/KiCad/KiCad.app/Contents/SharedSupport/footprints/Capacitor_SMD.pretty/C_1210_3225Metric.kicad_mod');s=modify(f.read_text()).replace('C_1210_3225Metric',name)
s=re.sub(r'\(descr "[^"]*"\)', '(descr "TDK C3225X7R1H226M250AC candidate: A=2.2 B=1.1 C=2.2mm; TDK GC11010030 Sep2026 p19; not factory approved")',s,count=1)
(P/'MotorStage.pretty'/(name+'.kicad_mod')).write_text(s)
(P/'patch-receipt-A90.json').write_text(json.dumps({'changed_refs':['C7','C8'],'footprint':name,'pad_centers_mm':[-1.65,1.65],'pad_size_mm':[1.1,2.2],'inner_gap_mm':2.2,'courtyard_half_extents_mm':[2.45,1.65],'pad_UUIDs_preserved':True,'tracks_intentionally_unchanged':True,'baseline_sha256':hashlib.sha256((P/'baseline-A86.kicad_pcb').read_bytes()).hexdigest(),'manufacturing_release':False},indent=2)+'\n')
print('patched C7/C8, schematic and local library')
