"""Reproducible illustrative kettle model. No measurements or appliance testing.

Run: python analyze.py --output OUTPUT_DIRECTORY
Energy to heat water = mass * specific_heat * temperature change; electrical
input is water energy / assumed efficiency. Time is input energy / power.
"""
import argparse, csv, json
from pathlib import Path

parser=argparse.ArgumentParser();parser.add_argument('--output',type=Path,default=Path(__file__).resolve().parent);args=parser.parse_args()
out=args.output;out.mkdir(parents=True,exist_ok=True)
specific_heat=4184 # J/(kg K), approximate constant over modeled range
density=1.0 # kg/L approximation
delta_t=80 # 20 to 100 C; not altitude-adjusted
volumes=[0.25,0.5,1.0,1.7]
efficiencies=[0.85,0.95] # chosen illustrative assumptions, not measured
rows=[]
for volume in volumes:
    water_j=volume*density*specific_heat*delta_t
    for eff in efficiencies:
        input_kwh=water_j/eff/3_600_000
        rows.append({'water_l':volume,'temperature_start_c':20,'temperature_end_c':100,'assumed_efficiency':eff,'water_kwh':water_j/3_600_000,'input_kwh':input_kwh,'minutes_at_1500w':input_kwh/1.5*60,'minutes_at_3000w':input_kwh/3*60})
with (out/'results.csv').open('w',newline='',encoding='utf-8') as f:
    w=csv.DictWriter(f,fieldnames=rows[0]);w.writeheader();w.writerows(rows)
lookup={(r['water_l'],r['assumed_efficiency']):r for r in rows}
saving=(lookup[(1.0,.85)]['input_kwh']-lookup[(.5,.85)]['input_kwh'])*730
summary={'assumptions':{'water_density_kg_per_l':density,'heat_capacity_j_per_kg_kelvin':specific_heat,'temperature_start_c':20,'temperature_end_c':100,'efficiencies':'illustrative, not measured','boils_per_year':730,'minimum_fill_and_fixed_losses':'not modeled'},'results':rows,'annual_difference_kwh_two_boil_per_day_1l_vs_0_5l_eff85':saving,'limitations':'Approximate constant heat capacity/density; ignores altitude, vessel heating, heat loss dynamics, residual energy, standby, warm-start and boil-off. Efficiency and electrical power are assumed constant. Heating to 100 C is not vaporizing water. Unit prices not supplied.'}
(out/'results.json').write_text(json.dumps(summary,indent=2)+'\n',encoding='utf-8')
print(json.dumps({'one_litre_at_85pct_kwh':lookup[(1.0,.85)]['input_kwh'],'half_litre_at_85pct_kwh':lookup[(.5,.85)]['input_kwh'],'annual_difference_kwh':saving},indent=2))
