html,body{min-height:100%;font-family:Inter,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}button,input,select,textarea{font:inherit}.pos-scroll::-webkit-scrollbar{width:8px;height:8px}.pos-scroll::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:999px}.touch-card{touch-action:manipulation}.safe-bottom{padding-bottom:calc(80px + env(safe-area-inset-bottom))}@media (min-width:1024px){.desktop-only{display:block}.mobile-only{display:none!important}}@media (max-width:1023px){.desktop-only{display:none!important}.mobile-only{display:flex}}.modal-backdrop{backdrop-filter:blur(3px)}.kds-card{min-width:300px;max-width:360px}.timer-ok{background:#16a34a}.timer-warn{background:#f59e0b}.timer-danger{background:#dc2626}.item-img{aspect-ratio:1/1;object-fit:cover}.glass{background:rgba(255,255,255,.88);backdrop-filter:blur(10px)
    private function inventory(): never {
        $u=$this->user(); Auth::requireRole(['BRANCHMANAGER','SUPERADMIN']); $out=$this->outletId($u);
        $s=$this->db->prepare('SELECT id,name,unit,current_stock,reorder_level,cost_per_unit FROM inventory_items WHERE outlet_id=? AND is_active=1 ORDER BY name');$s->execute([$out]);
        Auth::json(['ok'=>true,'data'=>$s->fetchAll()]);
    }
    private function saveInventory(): never {
        $u=$this->user(); Auth::requireRole(['BRANCHMANAGER','SUPERADMIN']); Auth::checkCsrf($_SERVER['HTTP_X_CSRF_TOKEN']??null);$in=$this->input();$out=$this->outletId($u);$id=(int)($in['id']??0);$name=trim((string)($in['name']??''));if(!$name)Auth::json(['ok'=>false,'error'=>'NAME_REQUIRED'],422);
        if($id){$this->db->prepare('UPDATE inventory_items SET name=?,unit=?,current_stock=?,reorder_level=?,cost_per_unit=? WHERE id=? AND outlet_id=?')->execute([$name,$in['unit']??'pcs',(float)($in['current_stock']??0),(float)($in['reorder_level']??0),(float)($in['cost_per_unit']??0),$id,$out]);}
        else{$this->db->prepare('INSERT INTO inventory_items(outlet_id,name,unit,current_stock,reorder_level,cost_per_unit) VALUES(?,?,?,?,?,?)')->execute([$out,$name,$in['unit']??'pcs',(float)($in['current_stock']??0),(float)($in['reorder_level']??0),(float)($in['cost_per_unit']??0)]);}
        Auth::json(['ok'=>true]);
    }
    private function saveRecipe(): never {
        $u=$this->user(); Auth::requireRole(['BRANCHMANAGER','SUPERADMIN']); Auth::checkCsrf($_SERVER['HTTP_X_CSRF_TOKEN']??null);$in=$this->input();$out=$this->outletId($u);
        $menu=(int)($in['menu_item_id']??0);$inv=(int)($in['inventory_item_id']??0);$qty=(float)($in['qty_per_item']??0);if(!$menu||!$inv||$qty<=0)Auth::json(['ok'=>false,'error'=>'RECIPE_DATA_REQUIRED'],422);
        $this->db->prepare('INSERT INTO recipe_links(outlet_id,menu_item_id,inventory_item_id,qty_per_item) VALUES(?,?,?,?) ON DUPLICATE KEY UPDATE qty_per_item=VALUES(qty_per_item)')->execute([$out,$menu,$inv,$qty]);Auth::json(['ok'=>true]);
    }
    private function pushMenu(): never {
        $u=$this->user(); Auth::requireRole(['SUPERADMIN']); Auth::checkCsrf($_SERVER['HTTP_X_CSRF_TOKEN']??null);$in=$this->input();$source=(int)($in['source_outlet_id']??0);$target=(int)($in['target_outlet_id']??0);if(!$source||!$target||$source===$target)Auth::json(['ok'=>false,'error'=>'SOURCE_TARGET_REQUIRED'],422);
        $this->db->beginTransaction();try{
            $this->db->prepare('DELETE mi FROM menu_items mi JOIN menu_categories mc ON mc.id=mi.category_id WHERE mi.outlet_id=?')->execute([$target]);$this->db->prepare('DELETE FROM menu_categories WHERE outlet_id=?')->execute([$target]);
            $cs=$this->db->prepare('SELECT * FROM menu_categories WHERE outlet_id=? ORDER BY id');$cs->execute([$source]);$catMap=[];$insC=$this->db->prepare('INSERT INTO menu_categories(outlet_id,name,image_url,sort_order,is_active) VALUES(?,?,?,?,?)');foreach($cs as $c){$insC->execute([$target,$c['name'],$c['image_url'],$c['sort_order'],$c['is_active']]);$catMap[$c['id']]=(int)$this->db->lastInsertId();}
            $is=$this->db->prepare('SELECT * FROM menu_items WHERE outlet_id=? ORDER BY id');$is->execute([$source]);$insI=$this->db->prepare('INSERT INTO menu_items(outlet_id,category_id,sku,name,short_name,description,image_url,price,tax_rate,veg,is_active) VALUES(?,?,?,?,?,?,?,?,?,?,?)');foreach($is as $i){if(isset($catMap[$i['category_id']]))$insI->execute([$target,$catMap[$i['category_id']],$i['sku'],$i['name'],$i['short_name'],$i['description'],$i['image_url'],$i['price'],$i['tax_rate'],$i['veg'],$i['is_active']]);}
            $this->audit('PUSH_MENU','outlets',$target,['source'=>$source]);$this->db->commit();Auth::json(['ok'=>true]);
        }catch(Throwable $e){$this->db->rollBack();throw $e;}
    }
    private function saveOutlet(): never {
        $u=$this->user();Auth::requireRole(['SUPERADMIN']);Auth::checkCsrf($_SERVER['HTTP_X_CSRF_TOKEN']??null);$in=$this->input();$id=(int)($in['id']??0);$code=trim((string)($in['code']??''));$name=trim((string)($in['name']??''));if(!$code||!$name)Auth::json(['ok'=>false,'error'=>'CODE_NAME_REQUIRED'],422);
        if($id)$this->db->prepare('UPDATE outlets SET code=?,name=?,address=?,phone=?,gstin=?,receipt_footer=? WHERE id=?')->execute([$code,$name,$in['address']??null,$in['phone']??null,$in['gstin']??null,$in['receipt_footer']??null,$id]);else{$this->db->prepare('INSERT INTO outlets(code,name,address,phone,gstin,receipt_footer) VALUES(?,?,?,?,?,?)')->execute([$code,$name,$in['address']??null,$in['phone']??null,$in['gstin']??null,$in['receipt_footer']??null]);$id=(int)$this->db->lastInsertId();}Auth::json(['ok'=>true,'id'=>$id]);
    }
}
