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

const{MenuBar:MenuBar,Theme:Theme,DialogCreator:DialogCreator}=w96.ui,{TabControl:TabControl,ListView:ListView,GroupBox:GroupBox,GraphStatBox:GraphStatBox}=w96.ui.components,{procMgr:procMgr}=w96.state,{execCmd:execCmd}=w96.sys,{DomUtils:DomUtils}=w96.util;function enumerateTasks(){return w96.WindowSystem.windows.filter((e=>null!=e&&e.appbarRegistered))}class TaskManagerApplication extends WApplication{constructor(){super(),this.updateInterval=1e3,this.updateFunc=null,this._state={selectedTask:null}}async main(e){await super.main(e),this.title="taskmgr";const t=this.createWindow({title:"Task Manager",initialWidth:404,initialHeight:447,bodyClass:"taskmgr-app",body:'<div class="appbar"></div>\n            <div class="tabc"></div>\n            <footer class="w96-footer">\n                <div class="cell proc">\n                    Processes: 0\n                </div> \n                <div class="cell mem">\n                    Memory Usage: 0 MB\n                </div> \n            </footer>',icon:await Theme.getIconUrl("apps/taskmgr","16x16"),taskbar:!0},!0),a=t.getBodyContainer(),s=new MenuBar;s.addRoot("File",[{type:"normal",label:"New Task",onclick:()=>this.showNewTaskDlg()},{type:"separator"},{type:"normal",label:"Exit",onclick:()=>this.terminate()}]),s.addRoot("Help",[{type:"normal",label:"About",onclick:async()=>DialogCreator.alert('<span class="bold-noaa">Task Manager</span><br>Version 1.0',{title:"About",icon:await Theme.getIconUrl("apps/taskmgr")})}]),a.querySelector(".appbar").replaceWith(s.getMenuDiv());const n=new TabControl;n.openPage(n.addPage("Applications",(async e=>{this._state.selectedTask=null,e.classList.add("tab-applications"),e.style.padding="15px",e.innerHTML='<div class="table"></div>\n            <div class="buttons">\n                <button class="w96-button end-task">End Task</button>\n                <button class="w96-button switch-to">Switch To</button>\n                <button class="w96-button new-task">New Task</button>\n            </div>';const t=new ListView;t.addColumnHeader("Task",200),t.addColumnHeader("Status");for(let e of enumerateTasks()){let a;this._state.selectedTask||(this._state.selectedTask=e),a=null!=e.windowIcon&&""!=e.windowIcon.trim()?`${e.windowIcon}`:`${await Theme.getIconUrl("mime/executable","16x16")}`;const s=t.pushData([e.title||"<unnamed>","Running"],a);s.addEventListener("click",(()=>{this._state.selectedTask=e})),s.addEventListener("dblclick",(()=>this.performSwitchTo(this._state.selectedTask)))}e.querySelector("button.end-task").addEventListener("click",(()=>{this._state.selectedTask&&(this._state.selectedTask.close(),setTimeout((()=>{if(this._state&&this._state.selectedTask&&!this._state.selectedTask.wndObject){const e=t.getSelectedItem();e&&e.remove(),this._state.selectedTask=null}}),1e3))})),e.querySelector("button.switch-to").addEventListener("click",(()=>this.performSwitchTo(this._state.selectedTask))),e.querySelector("button.new-task").addEventListener("click",(()=>this.showNewTaskDlg())),e.querySelector(".table").replaceWith(t.getElement()),t.select(0)}))),n.addPage("Processes",(e=>{e.style.padding="15px",e.classList.add("tab-processes"),e.innerHTML='<div class="table"></div>\n            <div class="buttons">\n                <button class="w96-button">End Process</button>\n            </div>';const t=new ListView;t.setSelectionMode("full"),t.addColumnHeader("ID",25),t.addColumnHeader("Title",80),t.addColumnHeader("Class Name");for(let e of w96.state.processes)e&&t.pushData([e.appId||"??",e.title||"unnamed",e.constructor.name||"(unknown)"]);e.querySelector(".table").replaceWith(t.getElement()),t.select(0),e.querySelector("button").addEventListener("click",(()=>{const e=t.getSelectedItem();e&&DialogCreator.confirm("WARNING: Terminating a process can cause undesired results including loss of data and system instability. \nThe process will not be given the chance to save its state or data before it is terminated. Are you sure you want to terminate the process?",{title:"Task Manager Warning",icon:"warning",maxWidth:342},(a=>{if(a){const a=t.getSelectedColumnData(0);if(!a)return void DialogCreator.alert("This process cannot be killed.",{title:"Task Manager Error",icon:"error"});procMgr.quit(parseInt(a),!0),e.remove()}}))}))})),a.querySelector(".tabc").replaceWith(n.getElement()),t.show(),this.mainwnd=t,this.updateProc(),this.updateFunc=setInterval((()=>this.updateProc()),this.updateInterval)}showNewTaskDlg(){execCmd("run",[])}performSwitchTo(e){e&&(e.minimized&&e.toggleMinimize(),e.activate())}updateProc(){const e=this.mainwnd.getBodyContainer();e.querySelector(".w96-footer .cell.mem").textContent=`Memory Usage: ${Number(((window.performance.memory||{usedJSHeapSize:0}).usedJSHeapSize/1024/1024).toFixed(1))} MB`;e.querySelector(".w96-footer .cell.proc").textContent=`Processes: ${w96.state.procMgr.getRunningProcesses().length}`}async ontermination(){await super.ontermination(),console.log("Closing down..."),null!==this.updateFunc&&(clearInterval(this.updateFunc),this.updateInterval=null,this.updateFunc=null),this._state=null,this.mainwnd=null}}

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