import 'dart:convert'; /// Top-level response for the menu API class MenuResponse { final bool success; // API call success flag final String message; // Response message final List data; // List of menu items final dynamic errors; // Error details (if any) final int statusCode; // HTTP-like status code final DateTime timestamp; // Response timestamp MenuResponse({ required this.success, required this.message, required this.data, this.errors, required this.statusCode, required this.timestamp, }); /// Creates a MenuResponse from a JSON map factory MenuResponse.fromJson(Map json) { return MenuResponse( success: json['success'] as bool? ?? false, message: json['message'] as String? ?? '', data: (json['data'] as List?) ?.map((e) => MenuItem.fromJson(e as Map)) .toList() ?? [], errors: json['errors'], statusCode: json['statusCode'] as int? ?? 0, timestamp: DateTime.tryParse(json['timestamp'] as String? ?? '') ?? DateTime.now(), ); } /// Converts the MenuResponse back to JSON map Map toJson() { return { 'success': success, 'message': message, 'data': data.map((e) => e.toJson()).toList(), 'errors': errors, 'statusCode': statusCode, 'timestamp': timestamp.toIso8601String(), }; } /// Parse from raw JSON string static MenuResponse fromRawJson(String str) => MenuResponse.fromJson(json.decode(str) as Map); /// Convert to raw JSON string String toRawJson() => json.encode(toJson()); } /// Individual menu item class MenuItem { final String id; // Unique item ID final String name; // Display text final String? icon; // Icon name from backend (e.g. "inventory_2") final String? route; // Flutter route to open the screen final bool available; // Whether the menu should be shown MenuItem({ required this.id, required this.name, this.icon, this.route, required this.available, }); /// Creates MenuItem from JSON map (handles both camelCase and PascalCase) factory MenuItem.fromJson(Map json) { return MenuItem( id: json['id']?.toString() ?? json['menuId']?.toString() ?? json['MenuId']?.toString() ?? '', name: json['name'] ?? json['menuName'] ?? json['MenuName'] ?? '', icon: json['icon'] ?? json['iconName'] ?? json['IconName'] ?? null, route: json['route'] ?? json['menuRoute'] ?? json['MenuRoute'] ?? null, available: json['available'] ?? json['isAvailable'] ?? json['IsAvailable'] ?? false, ); } /// Converts MenuItem back to JSON Map toJson() { return { 'id': id, 'name': name, 'icon': icon, 'route': route, 'available': available, }; } }