"""Conditional securement retrieval; no structural/spring capacity or welding permission."""
import json,math
from pathlib import Path

def load(path=None):return json.loads(Path(path or Path(__file__).with_name('c14-construction-methods.json')).read_text())

def spring_count(data,uninsulated_OD_in,temperature_F,*,matched_assembly_basis=False):
 if not matched_assembly_basis:raise ValueError('Matched4-inch spring/preload/hot-extension/layer basis required')
 if not all(math.isfinite(x) for x in [uninsulated_OD_in,temperature_F]) or uninsulated_OD_in<=0:raise ValueError('Invalid diameter/temperature')
 hits=[i for i,(a,b) in enumerate(data['spring_temperature_rows_F']) if a<=temperature_F<=b]
 if len(hits)!=1:raise ValueError('Temperature outside unique printed band, including unresolved1000F overlap')
 if uninsulated_OD_in<30:return {'kind':'no_springs_required','count':0,'basis':'Smallerdiameter disposition in selected route; notgenericcapacity'}
 cols=[i for i,(a,b) in enumerate(data['spring_diameter_bands_in']) if a<=uninsulated_OD_in<=b]
 if len(cols)!=1:raise ValueError('Diameter outside unique printed band; no gap rounding or extrapolation')
 table=next(t for t in data['tables'] if t['id']=='vessel-band-spring-count');raw=table['rows'][table['header_rows']+hits[0]]['cells'][1+cols[0]]['raw']
 return {'kind':'no_springs_required' if raw=='-' else 'spring_count','count':0 if raw=='-' else int(raw),'raw':raw,'diameter_band_in':data['spring_diameter_bands_in'][cols[0]],'temperature_band_F':data['spring_temperature_rows_F'][hits[0]],'conditions':table['notes']}

def vessel_band(OD_in,temperature_F,orientation,layer):
 if not all(math.isfinite(x) for x in [OD_in,temperature_F]) or OD_in<=0 or orientation not in ['vertical','horizontal'] or layer not in ['inner','outer','single']:raise ValueError('Invalid schedule inputs')
 if 70<=temperature_F<=600:spacing=12 if orientation=='vertical' else 9
 elif 601<=temperature_F<=1200:spacing=9
 else:raise ValueError('No supplied temperature route, including fractional600–601 gap')
 return {'width_in':.5 if OD_in<=72 else .75,'thickness_in':.020,'spacing_in':spacing,'layer':layer,'scope':'Local bandretention route; separately secureeachlayer; specialfireproofassembly and headbridle conditions separately retained'}

def pipe_wire_band(insulated_OD_in,layer,insulation_thickness_in):
 if not all(math.isfinite(x) for x in [insulated_OD_in,insulation_thickness_in]) or min(insulated_OD_in,insulation_thickness_in)<=0 or layer not in ['inner','outer','single']:raise ValueError('Invalid schedule inputs')
 if insulated_OD_in>24:
  if layer=='inner':raise ValueError('Over24in table row is explicitly single/outer; no inner disposition supplied here')
  return {'kind':'band','width_in':.5,'thickness_in':.020,'spacing_in':9}
 if layer=='outer' or (layer=='single' and insulation_thickness_in>=3):raise ValueError('Wire schedule stated inner/single-below3in scope not met')
 return {'kind':'wire','gauge':18 if insulated_OD_in<12 else 16,'spacing_in':9}
