import 'dart:math' as math; import 'package:flutter/material.dart'; import 'package:geolocator/geolocator.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; class TecsMobileInterlockingCore { final supabase = Supabase.instance.client; // COMPONENT A: MOBILE CLINICIAN SIGNUP & SYSTEM CLOUD INTEGRATION Future executeNurseProfileSignup({ required String fullName, required String licenseNumber, required DateTime blsExpiration, required DateTime tbExpiration, }) async { try { if (fullName.isEmpty || licenseNumber.isEmpty) return false; // Ingest structural data models directly into core profile table rows await supabase.from('nurses').insert({ 'name': fullName, 'license_number': licenseNumber, 'license_status': 'Active', 'compliance_status': 'Green', 'bls_expiration': blsExpiration.toIso8601String(), 'tb_expiration': tbExpiration.toIso8601String(), }); return true; } catch (e) { debugPrint('Mobile registration structural fault: $e'); return false; } } // COMPONENT B: FRAUD-PROOF GEOFENCED PROXIMITY ATTENDANCE CLOCK Future executeGeofencedClockIn({ required String shiftId, required String nurseId, required String facilityId, }) async { try { // Step 1: Verify smartphone geolocation hardware permission states are active LocationPermission permission = await Geolocator.checkPermission(); if (permission == LocationPermission.denied) { permission = await Geolocator.requestPermission(); if (permission == LocationPermission.denied) { return "CLOCK_IN_DENIED: Location verification parameters are mandatory to calculate attendance timestamps."; } } // Step 2: Query highly accurate positioning coordinates of the mobile device Position currentPosition = await Geolocator.getCurrentPosition( desiredAccuracy: LocationAccuracy.high, ); // Step 3: Fetch facility coordinates from secure multi-tenant profiles table final facilityData = await supabase .from('facilities') .select('gps_latitude, gps_longitude') .eq('id', facilityId) .single(); if (facilityData == null) return "ERROR: Facility tracking parameters not located."; double facilityLat = facilityData['gps_latitude'] as double; double facilityLng = facilityData['gps_longitude'] as double; // Step 4: Run mathematical Haversine calculations to find real distance parameters double distanceInMeters = Geolocator.distanceBetween( currentPosition.latitude, currentPosition.longitude, facilityLat, facilityLng, ); // CRITICAL RADIUS GEOFENCE INTERLOCK: 200 Meters Absolute Threshold Margin if (distanceInMeters > 200.0) { return "CLOCK_IN_DENIED: Proximity lock activated. You are currently ${distanceInMeters.toStringAsFixed(1)} meters outside your designated facility zone."; } // Step 5: Clock-in verified. Commit attendance markers to database shift timeline await supabase.from('shifts').update({ 'nurse_id': nurseId, 'is_locked': true, }).eq('id', shiftId); return "CLOCK_IN_SUCCESSFUL: Geometric footprint approved. Shift billing logs are live."; } catch (e) { return "SYSTEM_FAULT_EXCEPTION: Connection dropped during GPS validation routing: $e"; } } }