"""Illustrative analytical scenarios for Root18D's software overload perspective.
Run: python model.py (standard library) to generate CSV.
Run: python model.py --plot (requires matplotlib) to also generate the figure.
No empirical observations or external datasets are used.
"""
import argparse,csv
from pathlib import Path

def cost(multiplier,elasticity,n0=100,c0=20):
    return n0*c0*multiplier**(elasticity-1)

def waiting_minutes(arrivals,capacity=20):
    if arrivals>=capacity:return None
    return 60*(arrivals/capacity)/(capacity-arrivals)

def main():
    args=argparse.ArgumentParser();args.add_argument('--plot',action='store_true');args.add_argument('--output',type=Path,default=Path('.'));opts=args.parse_args();opts.output.mkdir(parents=True,exist_ok=True)
    with (opts.output/'scenarios.csv').open('w',newline='') as f:
        w=csv.writer(f,lineterminator="\n");w.writerow(['cost_reduction_factor','assumed_elasticity','baseline_active_capabilities','baseline_monthly_cost_per_capability_usd','scenario_monthly_runtime_cost_usd'])
        for e in [.5,1,1.5]:
            for m in [1,2,4,8]:w.writerow([m,e,100,20,round(cost(m,e),2)])
    assert cost(4,.5)==1000 and cost(4,1)==2000 and cost(4,1.5)==4000
    assert waiting_minutes(10)==3 and waiting_minutes(18)==27 and waiting_minutes(20) is None
    if opts.plot:
        import matplotlib
        matplotlib.use('Agg')
        import matplotlib.pyplot as plt
        plt.rcParams.update({'font.size':13,'svg.fonttype':'none','svg.hashsalt':'root18d-software-overload-v1'})
        fig,ax=plt.subplots(figsize=(12,5.8),layout='constrained');fig.patch.set_facecolor('#0c1118');ax.set_facecolor('#0c1118')
        xs=[1+i*7/100 for i in range(101)]
        for e,col in [(.5,'#4de0eb'),(1,'#c0cbd6'),(1.5,'#f0bb65')]:ax.plot(xs,[cost(x,e) for x in xs],label=f'Assumed elasticity = {e}',color=col,lw=2.5)
        ax.scatter([4]*3,[1000,2000,4000],color=['#4de0eb','#c0cbd6','#f0bb65'],zorder=3)
        ax.set(xlabel='Reduction factor in average operating cost per capability (m)',ylabel='Illustrative total runtime cost ($ / month)',xlim=(1,8),ylim=(0,6200),xticks=[1,2,4,8])
        ax.tick_params(colors='#cbd6df');ax.xaxis.label.set_color('#e9eef3');ax.yaxis.label.set_color('#e9eef3')
        for s in ax.spines.values():s.set_color('#536273')
        ax.grid(alpha=.18);leg=ax.legend(facecolor='#151e29',edgecolor='#536273',loc='upper left');plt.setp(leg.get_texts(),color='#e9eef3')
        fig.suptitle('Conditional scenarios • no measured observations',color='#e9eef3',fontsize=16)
        fig.savefig(opts.output/'economics.svg',metadata={'Date':None})
        svg_path=opts.output/'economics.svg'
        svg_path.write_text('\n'.join(line.rstrip() for line in svg_path.read_text().splitlines())+'\n')
        plt.close(fig)

if __name__=='__main__':main()
