"""Retrieve conditional electric-HOLD thickness or calculate an explicit envelope chain."""
from pathlib import Path
import json,math

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

def lookup(data,material,nominal_size_in,hold_F,*,minimum_design_F,assumed_autoignition_F):
 t=next((t for t in data['matrix_tables'] if t['material']==material),None)
 if t is None:raise ValueError('No supplied material matrix')
 if minimum_design_F!=t['basis']['minimum_design_F'] or assumed_autoignition_F!=t['basis']['assumed_autoignition_F']:raise ValueError('Different ambient/ignition premise requires supported assessment; no inherited lookup')
 if hold_F not in t['hold_temperatures_F']:raise ValueError('No exact listed HOLD column; no interpolation')
 row=next((r for r in t['rows'] if r['nominal_size_in']==nominal_size_in),None)
 if row is None:raise ValueError('No exact listed size; no interpolation')
 cell=row['cells'][t['hold_temperatures_F'].index(hold_F)]
 return {'material':material,'nominal_size_in':nominal_size_in,'HOLD_F':hold_F,'cell':cell,'basis':t['basis'],'interpretation':'Conditional stored outcome only; no cablepower/sheath solver or installed permission'}

def envelope(pipe_OD,bore,radial_insulation,jacket_radial):
 vals=[pipe_OD,bore,radial_insulation,jacket_radial]
 if not all(math.isfinite(v) for v in vals) or pipe_OD<=0 or bore<pipe_OD or min(radial_insulation,jacket_radial)<0:raise ValueError('Invalid explicit geometric inputs')
 return {'radial_gap':(bore-pipe_OD)/2,'bare_insulation_OD':bore+2*radial_insulation,'finished_envelope_OD':bore+2*radial_insulation+2*jacket_radial,'scope':'Concentric circular geometry only; use one consistent length unit; local jacket protrusions and cable shape require actual product envelope'}

if __name__=='__main__':
 import argparse
 p=argparse.ArgumentParser(description=__doc__);p.add_argument('material');p.add_argument('size_in',type=float);p.add_argument('hold_F',type=float);p.add_argument('--minimum-design-F',required=True,type=float);p.add_argument('--assumed-autoignition-F',required=True,type=float);a=p.parse_args()
 print(json.dumps(lookup(load(),a.material,a.size_in,a.hold_F,minimum_design_F=a.minimum_design_F,assumed_autoignition_F=a.assumed_autoignition_F),indent=2))
