//!wrt $BSPEC:{"icn":"apps/gameing","cpr":"Copyright (C) Windows 96 Team 2023.","dsc":"Gameing Sandbox Game","frn":"Gameing","ver":1,"ssy":"gui"}

const{MsgBoxSimple:MsgBoxSimple,DialogCreator:DialogCreator,Theme:Theme}=w96.ui,{GroupBox:GroupBox}=w96.ui.components,{sideloadZip:sideloadZip,wait:wait}=w96.util,{execCmd:execCmd}=w96.sys,{mkShortcut:mkShortcut}=w96.shell,SERVE_URL="https://serve01.windows96.net/gameing";class GameingLauncherApplication extends WApplication{constructor(){super()}async main(e){if(super.main(e),document.querySelector(".gameing-launcher-app"))return;const t=MsgBoxSimple.idleProgress("Launcher","Fetching latest game builds...");let n=[];try{const e=await fetch(SERVE_URL+"/builds.json");n=await e.json()}catch(e){console.error(e),await DialogCreator.alert("Failed to fetch builds!",{icon:"error"}).wait()}t.closeDialog();const o=this.createWindow({title:"Gameing Launcher",body:'\n                <div class="intro">\n                    Gameing is a sandbox game which you can download + play or stream.<br>\n                    <br>\n                    Note: Downloading requires more system RAM whilst streaming requires less RAM but more network bandwidth.\n                </div>\n                <div class="main">\n                    <div class="group-box"></div>\n                </div>\n                <div class="buttons">\n                    <button class="w96-button quit">Quit</button>\n\n                    <button class="w96-button dlp">Play</button>\n                    <button class="w96-button stream">Stream</button>\n                </div>\n            ',bodyClass:"gameing-launcher-app",center:!0,taskbar:!0,resizable:!1,controlBoxStyle:"WS_CBX_MINCLOSE",icon:await Theme.getIconUrl("apps/gameing","16x16"),initialWidth:417,initialHeight:233},!0),i=o.getBodyContainer(),a=new GroupBox({title:"Game Options",body:'\n                <div class="field">\n                    <span class="name">Game Version:</span>\n                    <select class="w96-textbox version-sel"></select>\n                </div>\n                <a href="#" class="mk-shortcut">Create shortcut</a>\n            '});i.querySelector(".group-box").replaceWith(a.getElement());const s=i.querySelector("select");for(let e of n){const t=document.createElement("option");t.value=e,t.innerText=e,s.appendChild(t)}0==n.length?(DialogCreator.alert("No builds were found!",{icon:"error"}),i.querySelectorAll("button:not(.quit)").forEach((e=>e.disabled=!0))):s.selectedIndex=s.options.length-1,i.querySelector("button.quit").addEventListener("click",(()=>o.close())),i.querySelector("button.stream").addEventListener("click",(()=>{execCmd("gameing-streamed",[n[s.selectedIndex]]),o.close()})),i.querySelector("button.dlp").addEventListener("click",(()=>this.processLocal(n[s.selectedIndex]))),i.querySelector(".mk-shortcut").addEventListener("click",(()=>{n[s.selectedIndex]&&(mkShortcut("c:/user/desktop/"+n[s.selectedIndex]+".link","apps/gameing","gameing-runner "+n[s.selectedIndex]),DialogCreator.alert("A shortcut was placed on the desktop.",{icon:"info"}))})),o.show(),this.mainwnd=o}async processLocal(e){const t=`c:/user/appdata/gameing/versions/${e}`,n=`https://serve01.windows96.net/gameing/versions/${e}/dl`;if(await FS.exists(t+"/build.json"))return execCmd("gameing-runner",[e]),void this.mainwnd.close();const o=this.mainwnd.getBodyContainer();o.classList.add("busy"),o.querySelectorAll("button").forEach((e=>e.disabled=!0));const i=DialogCreator.create({title:"Game Download",body:`Retrieving version ${e}, this may take some time...\n            <br>\n            <br>\n            <div class="w96-progressbar">\n                <div class="progress" style="width: 0%;animation: none;"></div>\n            </div>\n            <br>\n            <div class="status">\n                Downloading null [0 / 7] (100K / 200K complete)\n            </div>`,buttons:[],icon:"info"});i.wnd.setControlBoxStyle("WS_CBX_NONE");const a=i.wnd.getBodyContainer();a.querySelector(".icon").style.backgroundImage=`url(${await Theme.getIconUrl("apps/gameing")})`;const s=a.querySelector(".progress"),r=a.querySelector(".status"),l=["bin/code","bin/framework","bin/data"];try{r.innerText="Downloading resources...",await sideloadZip(n+"/resources.zip"),r.innerText="Downloading additional files...";let o=0;for(let e of l){r.innerText="Downloading "+e;const i=await fetch(n+"/"+e).then((e=>e.arrayBuffer()));let a=new Uint8Array(i);await FS.writebin(t+"/"+e,a),a=null,o++,s.style.width=`${Math.floor(o/l.length*100)}%`}r.innerText="Download complete, launching game in 3 seconds...",await wait(3e3),execCmd("gameing-runner",[e])}catch(e){console.error(e),alert(e,{icon:"error"})}i.close(),this.mainwnd.close()}ontermination(){super.ontermination(),this.mainwnd=null}}

return await WApplication.execAsync(new GameingLauncherApplication(), this.boxedEnv.args, this);