/// Model representing a site request with all necessary information /// Supports three request types: Add Site, Change Site, and Remove Site class SiteRequestModel { final String? id; final String requestType; final String employeeId; final String fullName; final String emailAddress; final String mobileNumber; final String? extensionNumber; final List siteIds; final List siteNames; final List? oldSiteIds; // For Change Site request final List? oldSiteNames; // For Change Site request final List? departmentIds; final List? departmentNames; final String role; final String status; // Pending, Approved, Rejected final DateTime requestDate; SiteRequestModel({ this.id, required this.requestType, required this.employeeId, required this.fullName, required this.emailAddress, required this.mobileNumber, this.extensionNumber, required this.siteIds, required this.siteNames, this.oldSiteIds, this.oldSiteNames, this.departmentIds, this.departmentNames, required this.role, required this.status, required this.requestDate, }); /// Converts model to JSON for API submission Map toJson() { return { 'id': id, 'requestType': requestType, 'employeeId': employeeId, 'fullName': fullName, 'emailAddress': emailAddress, 'mobileNumber': mobileNumber, 'extensionNumber': extensionNumber, 'siteIds': siteIds, 'siteNames': siteNames, 'oldSiteIds': oldSiteIds, 'oldSiteNames': oldSiteNames, 'departmentIds': departmentIds, 'departmentNames': departmentNames, 'role': role, 'status': status, 'requestDate': requestDate.toIso8601String(), }; } /// Creates model from API response JSON factory SiteRequestModel.fromJson(Map json) { final sitesData = _parseSitesFromJson(json); final departmentsData = _parseDepartmentsFromJson(json); return SiteRequestModel( id: json['id']?.toString() ?? json['requestNumber']?.toString() ?? '', requestType: _parseRequestType(json), employeeId: json['employeeId'] ?? '', fullName: json['userName'] ?? json['fullName'] ?? '', emailAddress: json['email'] ?? json['emailAddress'] ?? '', mobileNumber: json['mobileNumber'] ?? '', extensionNumber: json['extensionNo'] ?? json['extensionNumber'], siteIds: sitesData['siteIds'], siteNames: sitesData['siteNames'], oldSiteIds: sitesData['oldSiteIds'], oldSiteNames: sitesData['oldSiteNames'], departmentIds: departmentsData['departmentIds'], departmentNames: departmentsData['departmentNames'], role: json['role'] ?? '', status: _parseStatus(json), requestDate: _parseDate(json), ); } /// Creates a copy with optional field updates SiteRequestModel copyWith({ String? id, String? requestType, String? employeeId, String? fullName, String? emailAddress, String? mobileNumber, String? extensionNumber, List? siteIds, List? siteNames, List? oldSiteIds, List? oldSiteNames, List? departmentIds, List? departmentNames, String? role, String? status, DateTime? requestDate, }) { return SiteRequestModel( id: id ?? this.id, requestType: requestType ?? this.requestType, employeeId: employeeId ?? this.employeeId, fullName: fullName ?? this.fullName, emailAddress: emailAddress ?? this.emailAddress, mobileNumber: mobileNumber ?? this.mobileNumber, extensionNumber: extensionNumber ?? this.extensionNumber, siteIds: siteIds ?? this.siteIds, siteNames: siteNames ?? this.siteNames, oldSiteIds: oldSiteIds ?? this.oldSiteIds, oldSiteNames: oldSiteNames ?? this.oldSiteNames, departmentIds: departmentIds ?? this.departmentIds, departmentNames: departmentNames ?? this.departmentNames, role: role ?? this.role, status: status ?? this.status, requestDate: requestDate ?? this.requestDate, ); } // Private helper methods for parsing static Map _parseSitesFromJson(Map json) { List siteIds = []; List siteNames = []; List? oldSiteIds; List? oldSiteNames; if (json['sites'] != null && json['sites'] is List) { for (var site in json['sites']) { siteIds.add(site['siteId']?.toString() ?? ''); siteNames.add(site['siteName'] ?? ''); if (site['oldSiteId'] != null && site['oldSiteId'] != 0) { oldSiteIds ??= []; oldSiteNames ??= []; oldSiteIds.add(site['oldSiteId']?.toString() ?? ''); oldSiteNames.add(site['oldSitName'] ?? ''); } } } return { 'siteIds': siteIds, 'siteNames': siteNames, 'oldSiteIds': oldSiteIds, 'oldSiteNames': oldSiteNames, }; } static Map?> _parseDepartmentsFromJson(Map json) { List? departmentIds; List? departmentNames; if (json['departments'] != null && json['departments'] is List && (json['departments'] as List).isNotEmpty) { departmentIds = []; departmentNames = []; for (var dept in json['departments']) { departmentIds.add(dept['departmentId']?.toString() ?? ''); departmentNames.add(dept['departmentName'] ?? ''); } } return { 'departmentIds': departmentIds, 'departmentNames': departmentNames, }; } static String _parseRequestType(Map json) { return json['requestType'] is Map ? (json['requestType']['name'] ?? '') : (json['requestType'] ?? ''); } static String _parseStatus(Map json) { return json['status'] is Map ? (json['status']['name'] ?? 'Pending') : (json['status'] ?? 'Pending'); } static DateTime _parseDate(Map json) { if (json['createdDate'] != null) { return DateTime.parse(json['createdDate']); } else if (json['requestDate'] != null) { return DateTime.parse(json['requestDate']); } return DateTime.now(); } }