/* Fixed ES3 Premiere dispatcher, called only by the signed CEP bootstrap. */
function HiggsfieldPremiere(request) {
  function encode(v) {
    if (v === null || v === undefined) return 'null';
    if (typeof v === 'string') return '"' + v.replace(/[\\"\x00-\x1f]/g, function(c) {return '\\u' + ('0000' + c.charCodeAt(0).toString(16)).slice(-4);}) + '"';
    if (typeof v === 'number') return isFinite(v) ? String(v) : 'null';
    if (typeof v === 'boolean') return String(v);
    var out=[], k;
    if(v instanceof Array) {for(k=0;k<v.length;k++) out.push(encode(v[k])); return '['+out.join(',')+']';}
    for(k in v) if(Object.prototype.hasOwnProperty.call(v,k)) out.push(encode(k)+':'+encode(v[k]));
    return '{'+out.join(',')+'}';
  }
  try {return encode({ok:true,result:runPremiere(request.operation,request.args)});}
  catch(error) {return encode({ok:false,error:String(error)});}
}
function runPremiere(op,a) {
  function time(seconds) {var t=new Time();t.seconds=seconds;return t;}
  function output(p) {if(new File(p).exists) throw new Error('OUTPUT_EXISTS'); if(!new File(p).parent.exists) throw new Error('OUTPUT_PARENT_MISSING');}
  function input(p) {if(!new File(p).exists) throw new Error('INPUT_MISSING');}
  function info(p) {return p && p.path ? {name:p.name,path:p.path} : null;}
  function paged(rows) {return {total:rows.length,offset:a.offset,items:rows.slice(a.offset,a.offset+a.limit),hasMore:rows.length>a.offset+a.limit};}
  var p=app.project, rows=[], i, j;
  if(op==='project.create') {output(a.path); if(!app.newProject(a.path)) throw new Error('CREATE_FAILED');return info(app.project);}
  if(op==='project.open') {input(a.path);if(!app.openDocument(a.path,true,true,true,false)) throw new Error('OPEN_FAILED');return info(app.project);}
  if(op==='project.info') {
    if(p && p.path) for(i=0;i<p.sequences.numSequences;i++) rows.push({name:p.sequences[i].name,id:p.sequences[i].sequenceID});
    return {project:info(p),version:app.version,sequences:rows};
  }
  if(!p || p.path!==a.projectPath) throw new Error('PROJECT_CHANGED: inspect active project path');
  if(op==='project.save_as') {
    output(a.path);
    var saveStatus=p.saveAs(a.path);
    if((saveStatus!==0&&saveStatus!==true)||!new File(a.path).exists) throw new Error('SAVE_AS_FAILED: '+saveStatus);
    return info(app.project);
  }
  var root=p.rootItem;
  if(op==='media.import') {for(i=0;i<a.paths.length;i++) input(a.paths[i]); if(!p.importFiles(a.paths,true,root,false)) throw new Error('IMPORT_FAILED');return {importedPaths:a.paths};}
  if(op==='bin.list') {for(i=0;i<root.children.numItems;i++){var item=root.children[i];rows.push({id:String(item.nodeId),name:item.name,type:item.type});}return paged(rows);}
  if(op==='bin.create') {var bin=root.createBin(a.name);return {id:String(bin.nodeId),name:bin.name};}
  function itemById() {for(var n=0;n<root.children.numItems;n++) if(String(root.children[n].nodeId)===a.itemId) return root.children[n];throw new Error('PROJECT_ITEM_NOT_FOUND');}
  if(op==='item.rename') {var target=itemById();target.name=a.name;return {id:String(target.nodeId),name:target.name};}
  if(op==='sequence.create') {input(a.presetPath);var count=p.sequences.numSequences;p.newSequence(a.name,a.presetPath);if(p.sequences.numSequences<=count)throw new Error('SEQUENCE_CREATE_FAILED');return {name:a.name};}
  if(op==='sequence.list') {for(i=0;i<p.sequences.numSequences;i++) rows.push({name:p.sequences[i].name,id:p.sequences[i].sequenceID});return paged(rows);}
  var s=null;
  for(i=0;i<p.sequences.numSequences;i++) if(p.sequences[i].name===a.sequence) {if(s)throw new Error('SEQUENCE_NOT_UNIQUE');s=p.sequences[i];}
  if(!s) throw new Error('SEQUENCE_NOT_FOUND');
  if(op==='sequence.info') return {name:s.name,id:s.sequenceID,frameSize:{width:s.frameSizeHorizontal,height:s.frameSizeVertical},duration:Number(s.end)/254016000000,videoTracks:s.videoTracks.numTracks,audioTracks:s.audioTracks.numTracks};
  if(op==='sequence.clone') {var before=p.sequences.numSequences;s.clone();return {applied:p.sequences.numSequences>before};}
  if(op==='sequence.activate') {p.activeSequence=s;return {activeSequence:p.activeSequence.name};}
  if(op==='sequence.playhead') {s.setPlayerPosition(time(a.seconds).ticks);return {seconds:s.getPlayerPosition().seconds};}
  if(op==='sequence.range') {if(a.end<=a.start)throw new Error('INVALID_RANGE');s.setInPoint(a.start);s.setOutPoint(a.end);return {start:s.getInPointAsTime().seconds,end:s.getOutPointAsTime().seconds};}
  if(op==='sequence.export') {
    input(a.presetPath);output(a.path);
    if(a.queueToAME) {app.encoder.launchEncoder();var id=app.encoder.encodeSequence(s,a.path,a.presetPath,0,1);if(!id||id==='0')throw new Error('ENCODE_REJECTED');return {status:'submitted',jobId:id,path:a.path,completionVerified:false};}
    var result=s.exportAsMediaDirect(a.path,a.presetPath,0); if((result!==true&&result!=='No Error')||!new File(a.path).exists)throw new Error('EXPORT_FAILED: '+result);return {status:'completed',path:a.path,completionVerified:true};
  }
  if(op==='timeline.insert'||op==='timeline.overwrite') {
    if(a.videoTrack>=s.videoTracks.numTracks||a.audioTrack>=s.audioTracks.numTracks) throw new Error('TRACK_NOT_FOUND');
    var source=itemById();
    var applied=op==='timeline.insert'?s.insertClip(source,time(a.seconds),a.videoTrack,a.audioTrack):s.overwriteClip(source,time(a.seconds),a.videoTrack,a.audioTrack);
    if(applied!==true)throw new Error('TIMELINE_EDIT_FAILED: '+applied);
    return {applied:true};
  }
  if(op==='track.list') {for(j=0;j<2;j++){var tracks=j===0?s.videoTracks:s.audioTracks;for(i=0;i<tracks.numTracks;i++)rows.push({mediaType:j===0?'video':'audio',trackIndex:i,name:tracks[i].name,muted:Boolean(tracks[i].isMuted())});}return {tracks:rows};}
  var collection=a.mediaType==='video'?s.videoTracks:s.audioTracks;
  if(a.trackIndex>=collection.numTracks)throw new Error('TRACK_NOT_FOUND');
  var track=collection[a.trackIndex];
  if(op==='track.rename'){track.name=a.name;return {name:track.name};}
  if(op==='track.mute'){track.setMute(a.muted?1:0);return {muted:Boolean(track.isMuted())};}
  if(op==='clip.list'){for(i=0;i<track.clips.numItems;i++){var c=track.clips[i];rows.push({clipIndex:i,name:c.name,start:c.start.seconds,end:c.end.seconds,disabled:Boolean(c.disabled),inPoint:c.inPoint.seconds,outPoint:c.outPoint.seconds});}return paged(rows);}
  var clip=track.clips[a.clipIndex];
  if(!clip||clip.name!==a.expectedName||Math.abs(clip.start.seconds-a.expectedStart)>1e-7)throw new Error('STALE_CLIP');
  if(op==='clip.rename')clip.name=a.name;
  else if(op==='clip.move'){if(clip.start.seconds+a.offsetSeconds<0)throw new Error('NEGATIVE_START');clip.move(time(a.offsetSeconds));}
  else if(op==='clip.disable')clip.disabled=a.disabled;
  else if(op==='clip.source_range'){if(a.end<=a.start)throw new Error('INVALID_RANGE');clip.inPoint=time(a.start);clip.outPoint=time(a.end);}
  else throw new Error('UNKNOWN_OPERATION');
  return {name:clip.name,start:clip.start.seconds,end:clip.end.seconds,disabled:Boolean(clip.disabled)};
}
