import{guides,verifyRecording,config}from'./lab.mjs';
export function mount(doc=document,fetcher=fetch){const $=id=>doc.getElementById(id);let recording=null,index=0,controller=null;function render(){if(!recording)return;const run=recording.runs.find(x=>x.id===$('lesson').value);index=Math.max(0,Math.min(index,run.requests.length-1));const q=run.requests[index];$('guide').textContent=guides[run.id];$('step').textContent=`Запрос ${index+1} из ${run.requests.length}`;$('prev').disabled=index===0;$('next').disabled=index===run.requests.length-1;$('runtime').textContent=recording.runtime.version+' · '+recording.runtime.platform+' · '+recording.generatedAt;$('facts').replaceChildren();for(const[label,value]of[['HTTP',q.status],['bootId',q.body?.bootId??'нет PHP'],['handled',q.body?.handled??'—'],['HTTP, мс',q.elapsedMs]]){const box=doc.createElement('div');box.className='fact';const l=doc.createElement('span'),v=doc.createElement('strong');l.textContent=label;v.textContent=String(value);box.append(l,v);$('facts').append(box);}$('request').textContent=q.method+' '+q.path;$('body').textContent=JSON.stringify(q.body,null,2);$('meaning').textContent=q.body?.userBefore===null?`До запроса: пользователь не установлен, временных записей ${q.body.cacheBefore}.`:typeof q.body==='string'?'Ответ статического файла без данных Kernel.':'Смотрите полный ответ.';}
 async function load(){controller?.abort();const own=new AbortController();controller=own;const timeout=setTimeout(()=>own.abort(),12000);recording=null;$('lesson').disabled=true;$('prev').disabled=true;$('next').disabled=true;$('save-record').disabled=true;$('load-status').textContent='Загружаем запись…';try{const res=await fetcher('data/recording.json',{signal:own.signal});if(!res.ok)throw Error('HTTP '+res.status);const text=await res.text();if(text.length>1000000)throw Error('Слишком большой файл');const data=verifyRecording(JSON.parse(text));if(controller!==own)return;recording=data;$('lesson').replaceChildren();for(const r of data.runs){const o=doc.createElement('option');o.value=r.id;o.textContent=r.title;$('lesson').append(o);}index=0;$('lesson').disabled=false;$('save-record').disabled=false;$('load-status').textContent='Загружены восемь настоящих прогонов. Выберите опыт и переходите между запросами.';render();}catch(e){if(controller!==own)return;$('load-status').textContent='Не удалось прочитать запись. '+e.message;$('facts').replaceChildren();$('body').textContent='';$('step').textContent='';$('request').textContent='';$('meaning').textContent='';}finally{clearTimeout(timeout);}}
 function update(){$('domain').disabled=$('target').value==='local';$('workers').disabled=$('mode').value==='classic';$('max').disabled=$('mode').value==='classic';try{$('code').textContent=config({mode:$('mode').value,target:$('target').value,domain:$('domain').value,workers:Number($('workers').value),maxRequests:Number($('max').value)});$('config-status').textContent='Конфигурация готова. После скачивания проверьте её командой frankenphp validate --config Caddyfile.';$('save-config').disabled=false;}catch(e){$('code').textContent='';$('config-status').textContent=e.message;$('save-config').disabled=true;}}
 function save(name,text,type){const u=URL.createObjectURL(new Blob([text],{type})),a=doc.createElement('a');a.href=u;a.download=name;a.click();setTimeout(()=>URL.revokeObjectURL(u),1000);}
 $('lesson').addEventListener('change',()=>{index=0;render();});$('next').addEventListener('click',()=>{index++;render();});$('prev').addEventListener('click',()=>{index--;render();});$('reload').addEventListener('click',load);for(const k of['mode','target','domain','workers','max'])$(k).addEventListener('input',update);$('save-config').addEventListener('click',()=>save('Caddyfile',$('code').textContent,'text/plain'));$('save-record').addEventListener('click',()=>{if(recording)save('frankenphp-recording.json',JSON.stringify(recording,null,2),'application/json');});$('reset').addEventListener('click',()=>{$('mode').value='worker';$('target').value='local';$('domain').value='app.example.com';$('workers').value='2';$('max').value='1000';update();});update();return{ready:load(),load,update};}
if(typeof document!=='undefined')mount();
