import 'package:flutter/material.dart'; import 'package:test_sa/modules/site_request_module/models/dropdown_models.dart'; import 'package:test_sa/modules/site_request_module/models/mock_user_model.dart'; import 'package:test_sa/modules/site_request_module/models/request_type_model.dart'; import 'package:test_sa/modules/site_request_module/models/site_request_model.dart'; class SiteRequestProvider extends ChangeNotifier { bool _loading = false; bool get loading => _loading; set loading(bool value) { _loading = value; notifyListeners(); } String? _errorMessage; String? get errorMessage => _errorMessage; // Mock user data late MockUserModel _currentUser; MockUserModel get currentUser => _currentUser; // Request types as Base models final List _requestTypes = [ RequestTypeModel(id: 'add_site', name: 'Add Site'), RequestTypeModel(id: 'change_site', name: 'Change Site'), RequestTypeModel(id: 'remove_site', name: 'Remove Site'), ]; List get requestTypes => _requestTypes; // Mock sites as Base models final List _allSites = [ SiteRequestSiteModel(id: 'site_1', name: 'Site A'), SiteRequestSiteModel(id: 'site_2', name: 'Site B'), SiteRequestSiteModel(id: 'site_3', name: 'Site C'), SiteRequestSiteModel(id: 'site_4', name: 'Site D'), SiteRequestSiteModel(id: 'site_5', name: 'Site E'), ]; List get allSites => _allSites; // Mock departments as Base models final List _allDepartments = [ SiteRequestDepartmentModel(id: 'dept_1', name: 'HR'), SiteRequestDepartmentModel(id: 'dept_2', name: 'IT'), SiteRequestDepartmentModel(id: 'dept_3', name: 'Finance'), SiteRequestDepartmentModel(id: 'dept_4', name: 'Operations'), SiteRequestDepartmentModel(id: 'dept_5', name: 'Administration'), ]; List get allDepartments => _allDepartments; // History of submitted requests final List _requestHistory = []; List get requestHistory => _requestHistory; SiteRequestProvider() { _initializeMockUser(); } void _initializeMockUser() { _currentUser = MockUserModel( employeeId: 'EMP001', fullName: 'John Smith', emailAddress: 'john.smith@test.com', mobileNumber: '+966500000000', extensionNumber: '1234', role: 'Engineer', assignedSites: ['Site A', 'Site B'], ); } // Get available sites based on request type List getAvailableSites(String requestType) { if (requestType == 'Remove Site') { // Only return currently assigned sites return _allSites.where((site) { return _currentUser.assignedSites.contains(site.name ?? ''); }).toList(); } // For Add Site and Change Site, return all sites return _allSites; } // Check if user has assigned sites for removal bool hasAssignedSites() { return _currentUser.assignedSites.isNotEmpty; } // Submit site request (local only, no API) Future submitSiteRequest(SiteRequestModel request) async { loading = true; _errorMessage = null; notifyListeners(); // Simulate network delay await Future.delayed(const Duration(seconds: 1)); try { // Add request to history with a generated ID final requestWithId = request.copyWith( id: 'REQ_${DateTime.now().millisecondsSinceEpoch}', status: 'Pending', requestDate: DateTime.now(), ); _requestHistory.insert(0, requestWithId); loading = false; notifyListeners(); return true; } catch (error) { _errorMessage = 'Failed to submit request'; loading = false; notifyListeners(); return false; } } // Get request by ID SiteRequestModel? getRequestById(String id) { try { return _requestHistory.firstWhere((request) => request.id == id); } catch (e) { return null; } } // Reset provider state void reset() { _loading = false; _errorMessage = null; _requestHistory.clear(); _initializeMockUser(); notifyListeners(); } // Add mock history data for testing void addMockHistoryData() { final mockRequests = [ SiteRequestModel( id: 'REQ_001', requestType: 'Add Site', employeeId: _currentUser.employeeId, fullName: _currentUser.fullName, emailAddress: _currentUser.emailAddress, mobileNumber: _currentUser.mobileNumber, extensionNumber: _currentUser.extensionNumber, siteIds: ['site_3', 'site_4'], siteNames: ['Site C', 'Site D'], departmentIds: ['dept_2'], departmentNames: ['IT'], role: _currentUser.role, status: 'Approved', requestDate: DateTime.now().subtract(const Duration(days: 5)), ), SiteRequestModel( id: 'REQ_002', requestType: 'Change Site', employeeId: _currentUser.employeeId, fullName: _currentUser.fullName, emailAddress: _currentUser.emailAddress, mobileNumber: _currentUser.mobileNumber, extensionNumber: _currentUser.extensionNumber, siteIds: ['site_1'], siteNames: ['Site A'], departmentIds: ['dept_1', 'dept_3'], departmentNames: ['HR', 'Finance'], role: _currentUser.role, status: 'Pending', requestDate: DateTime.now().subtract(const Duration(days: 2)), ), SiteRequestModel( id: 'REQ_003', requestType: 'Remove Site', employeeId: _currentUser.employeeId, fullName: _currentUser.fullName, emailAddress: _currentUser.emailAddress, mobileNumber: _currentUser.mobileNumber, extensionNumber: _currentUser.extensionNumber, siteIds: ['site_2'], siteNames: ['Site B'], role: _currentUser.role, status: 'Rejected', requestDate: DateTime.now().subtract(const Duration(days: 10)), ), ]; _requestHistory.addAll(mockRequests); notifyListeners(); } }