/* Al Hajar Construction ERP — application composition and route host */
const REAL={dashboard:window.RoleDashboard,aicos:window.AICOSConsole,projects:window.Projects,clients:window.Clients,leads:window.Leads,estimation:window.Estimation,contracts:window.Contracts,variations:window.Variations,requisitions:window.Requisitions,rfq:window.RFQs,'purchase-orders':window.PurchaseOrders,suppliers:window.Suppliers,inventory:window.Inventory,subcontractors:window.Subcontractors,'search-results':window.SearchResults,'hse-incidents':window.HSEIncidents,'body-map':window.InjuryBodyMap,observations:window.Observations,permits:window.Permits,jsa:window.JSA,environment:window.Environment,ncr:window.NCR,itp:window.ITP,'quality-audits':window.QualityAudits,documents:window.Documents,calibration:window.Calibration,'fin-dashboard':window.FinanceDashboard,billing:window.Billing,'cost-control':window.CostControl,payables:window.Payables,receivables:window.Receivables,employees:window.Employees,attendance:window.Attendance,leave:window.Leave,payroll:window.Payroll,omanisation:window.Omanisation,training:window.Training,equipment:window.Equipment,ppm:window.PPM,'job-cards':window.JobCards,spares:window.Spares,'audit-trail':window.AuditTrail,access:window.AccessReview};
/* Every nav id resolves: real screens where built, an explanatory placeholder elsewhere. */
const PLACEHOLDER_IDS=[];
const MODULES=Object.assign({},REAL,PLACEHOLDER_IDS.reduce((map,id)=>{map[id]=props=><ModulePlaceholder id={id} {...props}/>;return map;},{}));
const NAV_TITLES=Object.fromEntries((window.NAV_GROUPS||[]).flatMap(g=>g.items.map(x=>[x[0],x[1]])));
function ModuleHost({id,onNav}){const Component=MODULES[id];return Component?<>{window.AIStrip&&<AIStrip module={id} onNav={onNav}/>}<Component onNav={onNav}/></>:<div className="page"><EmptyState title="Module unavailable" desc={`No component is registered for ${id}.`}/></div>}
function defaultModule(){return 'dashboard'}
function App(){
  const saved=sessionStorage.getItem('aicos-con-role');
  const [tick,setTick]=useState(0),[signedIn,setSignedIn]=useState(()=>!!saved),[active,setActive]=useState(defaultModule),[notif,setNotif]=useState(false),[ai,setAI]=useState(false);
  if(saved)window.ROLE=saved;
  const enter=role=>{window.ROLE=role;window.__signedIn=true;sessionStorage.setItem('aicos-con-role',role);setSignedIn(true);setTick(t=>t+1)};
  const signOut=()=>{sessionStorage.removeItem('aicos-con-role');window.__signedIn=false;setSignedIn(false);setNotif(false);setAI(false)};
  window.__signedIn=signedIn;
  window.__bump=()=>setTick(x=>x+1);
  window.__askAICOS=q=>{window.__aiPrefill=q;setAI(false);setTimeout(()=>setAI(true),0)};
  window.__search=q=>{window.__searchQ=q;setActive('search-results');setNotif(false);setAI(false)};
  useEffect(()=>{if(!signedIn)return;const allowed=window.allowedNav?window.allowedNav(window.ROLE).flatMap(g=>g.items.map(x=>x[0])):Object.keys(MODULES);if(!allowed.includes(active)&&active!=='search-results')setActive(defaultModule())},[tick,active,signedIn]);
  const navigate=id=>{setActive(id);setNotif(false);setAI(false)};
  if(!signedIn)return <StaffLogin onEnter={enter}/>;
  return <div className="app">
    {window.Sidebar&&<Sidebar active={active} onNav={navigate}/>}
    <main className="main">
      {window.Topbar&&<Topbar title={NAV_TITLES[active]||'Executive Dashboard'} onOpenNotif={()=>setNotif(true)} onOpenAI={()=>setAI(true)} onSignOut={signOut}/>}
      <section className="content"><ModuleHost id={active} onNav={navigate}/></section>
    </main>
    {window.NotifPanel&&<NotifPanel open={notif} onClose={()=>setNotif(false)} onNav={navigate}/>}
    {window.AICOSPanel&&<AICOSPanel open={ai} onClose={()=>setAI(false)} onNav={navigate}/>}
    {window.ToastHost&&<ToastHost/>}{window.FormHost&&<FormHost/>}
  </div>;
}
Object.assign(window,{App,ModuleHost,MODULES});
ReactDOM.createRoot(document.getElementById('root')).render(<App/>);
