import {calculate} from './engines.mjs'; const form=document.getElementById('calc-form'); if(form){const cfg=JSON.parse(document.getElementById('calc-data').textContent),err=document.getElementById('error'),assessment=document.getElementById('assessment');let result=null; const input=()=>{let a={};for(const f of cfg.fields){const e=form.elements.namedItem(f.key);if(!e||e.value.trim()==='')throw Error('Enter '+f.label);const n=Number(e.value);if(!Number.isFinite(n)||n<0||(f.strict&&n<=0)||(f.max!==null&&n>f.max)||(f.integer&&!Number.isInteger(n)))throw Error('Check '+f.label+' (invalid value)');a[f.key]=n;}return a;}; const money=new Intl.NumberFormat('en-IN',{style:'currency',currency:'INR',maximumFractionDigits:2});const num=new Intl.NumberFormat('en-IN',{maximumFractionDigits:2}); const fmt=(k,x)=>{if(x===null)return 'Not achievable';if(k==='beFeasible')return x?'Yes':'No';if(['productionUtil','utilPct','beSalesPct'].includes(k))return num.format(x)+'%';if(['beScale'].includes(k))return num.format(x)+'×';if(['production','accepted','sold','waterInput','waterWaste','bwPhysical','colourPhysical','hoursUsed','hoursAvailable','hoursDemand','beHours'].includes(k))return num.format(x);if(['beSold'].includes(k))return num.format(x);return money.format(x);}; const render=()=>{try{result=calculate(cfg.id,input());err.textContent='';for(const [k] of cfg.outputs){document.getElementById('o-'+k).textContent=fmt(k,result[k]);}const percent=result.utilPct??result.productionUtil??0;document.getElementById('meter').style.width=Math.min(100,percent)+'%';document.getElementById('meter-label').textContent='Capacity occupied: '+percent.toFixed(1)+'%';const good=result.beFeasible===1;assessment.className='assessment'+(good?'':' warning');assessment.textContent=(good?'The model can cover all stated costs within the entered capacity.':'Accounting break-even is not feasible with the current production, price, contribution or installed capacity.')+' '+(result.profit>=0?'Current assumptions show a positive accounting profit.':'Current assumptions show an accounting loss.');}catch(e){result=null;err.textContent=e.message;for(const [k] of cfg.outputs)document.getElementById('o-'+k).textContent='—';document.getElementById('meter').style.width='0';document.getElementById('meter-label').textContent='Capacity occupied: n/a';assessment.textContent='Correct inputs to display valid output.';assessment.className='assessment warning';}}; form.addEventListener('input',render);form.addEventListener('submit',e=>{e.preventDefault();render();});document.getElementById('reset-example').addEventListener('click',()=>{HTMLFormElement.prototype.reset.call(form);render();});document.getElementById('csv-export').addEventListener('click',()=>{if(!result){err.textContent='Correct all inputs before exporting.';return;}const rows=[['Finin2min calculator',document.title.split(' | ')[0]],['Data basis','Illustrative, ex-GST operating economics'],['Field','Value'],...cfg.fields.map(f=>[f.label,form.elements.namedItem(f.key).value]),['Metric','Value'],...cfg.outputs.map(([k,label])=>[label,result[k]===null?'Not achievable':result[k]])];const csv='\ufeff'+rows.map(row=>row.map(v=>'"'+String(v).replaceAll('"','""')+'"').join(',')).join('\r\n');const url=URL.createObjectURL(new Blob([csv],{type:'text/csv;charset=utf-8'})),a=document.createElement('a');a.href=url;a.download=location.pathname.split('/').pop().replace('.html','')+'-results.csv';document.body.appendChild(a);a.click();a.remove();setTimeout(()=>URL.revokeObjectURL(url),3000);});render();}