import{lessons,byKey}from'./schemas.mjs';import{validateText,importLines,recipe}from'./engine.mjs';
import{explainError}from'./messages.js';
export function mount(doc=document){const $=id=>doc.getElementById(id);let result=null;const current=()=>byKey[$('lesson').value];
 for(const l of lessons){const o=doc.createElement('option');o.value=l.key;o.textContent=l.title;$('lesson').append(o);}
 function clearFields(){for(const k of['name','email','age']){$(k+'-error').textContent='';$(k).removeAttribute('aria-invalid');}}
 function updateCode(){$('code').textContent=recipe(current().key,{mutate:$('mutate').checked});}
 function check(){clearFields();$('errors').replaceChildren();$('rows').replaceChildren();try{const l=current();result=l.key==='import'?importLines($('input').value):validateText(l.key,$('input').value,{mutate:$('mutate').checked});const valid=l.key==='import'?result.rejected===0:result.valid;$('status').textContent=l.key==='import'?`Строк: ${result.total}. Принято: ${result.accepted}. Отклонено: ${result.rejected}.`:valid?'Данные соответствуют схеме.':`Найдено ошибок: ${result.errors.length}.`;$('status').className='result '+(valid?'pass':'fail');
  if(l.key==='import'){for(const row of result.rows){const p=doc.createElement('p');p.className='import-row '+(row.valid?'pass':'fail');p.textContent=`Строка ${row.line}: ${row.valid?'принята':row.parseError??row.errors.map(e=>(e.path||'корень JSON')+' — '+explainError(e)).join('; ')}`;$('rows').append(p);}}
  else for(const e of result.errors){const li=doc.createElement('li');li.textContent=(e.path||'корень JSON')+' — '+explainError(e);$('errors').append(li);if(l.key==='form'){const field=e.path.slice(1);if(['name','email','age'].includes(field)){$(field+'-error').textContent+=explainError(e)+' ';$(field).setAttribute('aria-invalid','true');}}}
  $('output').textContent=JSON.stringify(l.key==='import'?result.rows.filter(r=>r.valid).map(r=>r.output):result.output,null,2);$('changes').textContent=l.key==='import'?'Показаны объекты только из принятых строк.':result.changed?'Копия данных изменилась. Исходный JSON слева сохранён.':'Данные не изменились.';
 }catch(e){result=null;$('status').textContent=e.message;$('status').className='result fail';$('output').textContent='';$('changes').textContent='Исправьте входные данные и повторите проверку.';}$('report').disabled=!result;updateCode();}
 function syncForm(){const data={name:$('name').value,email:$('email').value,age:$('age').value===''?null:Number($('age').value)};$('input').value=JSON.stringify(data,null,2);check();}
 function loadExample(kind){const l=current();if(l.key==='import'){$('input').value=JSON.stringify(l.good)+'\n'+(kind==='bad'?'{broken json}\n'+JSON.stringify(l.bad):JSON.stringify({...l.good,name:'Ольга'}));}else $('input').value=JSON.stringify(l[kind],null,2);if(l.key==='form')for(const k of['name','email','age'])$(k).value=String(l[kind][k]);check();}
 function select(){const l=current();$('why').textContent=l.why;$('guide').textContent=l.guide;$('schema').textContent=JSON.stringify(l.schema,null,2);$('form-fields').hidden=l.key!=='form';$('input').readOnly=l.key==='form';$('normalize-options').hidden=l.key!=='normalize';$('mutate').checked=false;$('input-label').textContent=l.key==='import'?'NDJSON: один JSON на строку':l.key==='form'?'JSON из формы (только чтение)':'JSON для проверки';loadExample('good');}
 function download(name,text,type='application/json'){const blob=new Blob([text],{type});const url=URL.createObjectURL(blob);const a=doc.createElement('a');a.href=url;a.download=name;a.click();setTimeout(()=>URL.revokeObjectURL(url),1000);}
 $('lesson').addEventListener('change',select);$('validate').addEventListener('click',check);$('mutate').addEventListener('change',check);$('good').addEventListener('click',()=>loadExample('good'));$('bad').addEventListener('click',()=>loadExample('bad'));$('reset').addEventListener('click',select);for(const k of['name','email','age'])$(k).addEventListener('input',syncForm);
 $('input').addEventListener('input',()=>{result=null;$('report').disabled=true;$('status').textContent='Данные изменены. Нажмите «Проверить данные».';$('status').className='result';$('errors').replaceChildren();$('rows').replaceChildren();$('output').textContent='';$('changes').textContent='';});
 $('report').addEventListener('click',()=>{if(result)download('ajv-report.json',JSON.stringify(result,null,2));});$('save-schema').addEventListener('click',()=>download('schema.json',JSON.stringify(current().schema,null,2)));$('save-code').addEventListener('click',()=>download('validate.mjs',recipe(current().key,{mutate:$('mutate').checked}),'text/javascript'));select();return{check,select};}
if(typeof document!=='undefined')mount();
