# Bloodwork Tracker
The bloodwork tracker feature helps users manage their lab results, medical appointments, and visualize trends in hormone levels over time.


## Models

- `Bloodwork`: Primary model for lab tests and medical appointments.
```dart
class Bloodwork {
  final String id;
  final DateTime date;
  final AppointmentType appointmentType;
  final List<HormoneReading> hormoneReadings;
  final String? location;
  final String? doctor;
  final String? notes;
}
```
- `HormoneReading`: Represents an individual hormone measurement with value and unit.
```dart
class HormoneReading {
  final String name;
  final double value;
  final String unit;
  
  // Serialization methods
  Map<String, dynamic> toJson() {...}
  factory HormoneReading.fromJson(Map<String, dynamic> json) {...}
}
```
- `AppointmentType`: Enumeration for different types of medical appointments (bloodwork, appointment, surgery).
- `HormoneTypes`: Contains predefined hormone types with their default units.

## Providers
- `bloodworkStateProvider`: Manages bloodwork CRUD operations
- Various derived providers: 

```dart
// Main state providers
final bloodworkStateProvider = StateNotifierProvider<BloodworkNotifier, BloodworkState>

// Derived providers
final bloodworkRecordsProvider = Provider<List<Bloodwork>>
final bloodworkLoadingProvider = Provider<bool>
final bloodworkErrorProvider = Provider<String?>
final sortedBloodworkProvider = Provider<List<Bloodwork>>
final bloodworkTypeRecordsProvider = Provider<List<Bloodwork>>
final bloodworkDatesProvider = Provider<Set<DateTime>>
final groupedBloodworkProvider = Provider<Map<String, List<Bloodwork>>>
final hormoneTypesProvider = Provider<List<String>>
final hormoneRecordsProvider = Provider.family<List<MapEntry<DateTime, double>>, String>
final latestHormoneValueProvider = Provider.family<double?, String>
```

### State Notifier
```dart
class BloodworkNotifier extends StateNotifier<BloodworkState> {
  // Notifier methods
  Future<void> loadBloodwork() async {...}
  Future<void> addBloodwork(Bloodwork bloodwork) async {...}
  Future<void> updateBloodwork(Bloodwork bloodwork) async {...}
  Future<void> deleteBloodwork(String id) async {...}
}
```

## Screens

- `BloodworkListScreen`: List of all appointments organized by upcoming/past/today.
- `AddEditBloodworkScreen`: Form for adding and editing appointments and lab results.
- `BloodLevelListScreen`: Overview display of all tracked hormone levels with mini graphs.
- `BloodworkGraphScreen`: Visualizations of hormone levels over time with reference ranges.

## Interactions

- Uses `DatabaseService` for persistent storage of bloodwork data
- Interacts with Scheduler feature to display appointments on calendar and daily views
- Uses `ValidationService` for data validation