84 lines
2.3 KiB
Dart
84 lines
2.3 KiB
Dart
import 'target_analysis.dart';
|
|
|
|
class Session {
|
|
final String id;
|
|
final String weapon;
|
|
final String? weaponId;
|
|
final int maxShotsPerTarget;
|
|
final List<TargetAnalysis> analyses;
|
|
final DateTime createdAt;
|
|
final String? notes;
|
|
final int distance; // Shooting distance in meters
|
|
|
|
Session({
|
|
required this.id,
|
|
required this.weapon,
|
|
this.weaponId,
|
|
required this.maxShotsPerTarget,
|
|
required this.analyses,
|
|
required this.createdAt,
|
|
this.notes,
|
|
this.distance = 25, // Default distance
|
|
});
|
|
|
|
int get targetCount => analyses.length;
|
|
|
|
int get totalShots => analyses.fold(0, (sum, a) => sum + a.shotCount);
|
|
|
|
int get totalScore => analyses.fold(0, (sum, a) => sum + a.totalScore);
|
|
|
|
double get averageScore => analyses.isEmpty ? 0.0 : totalScore / analyses.length;
|
|
|
|
Session copyWith({
|
|
String? id,
|
|
String? weapon,
|
|
String? weaponId,
|
|
int? maxShotsPerTarget,
|
|
List<TargetAnalysis>? analyses,
|
|
DateTime? createdAt,
|
|
String? notes,
|
|
int? distance,
|
|
}) {
|
|
return Session(
|
|
id: id ?? this.id,
|
|
weapon: weapon ?? this.weapon,
|
|
weaponId: weaponId ?? this.weaponId,
|
|
maxShotsPerTarget: maxShotsPerTarget ?? this.maxShotsPerTarget,
|
|
analyses: analyses ?? this.analyses,
|
|
createdAt: createdAt ?? this.createdAt,
|
|
notes: notes ?? this.notes,
|
|
distance: distance ?? this.distance,
|
|
);
|
|
}
|
|
|
|
Map<String, dynamic> toMap() {
|
|
return {
|
|
'id': id,
|
|
'weapon': weapon,
|
|
'weapon_id': weaponId,
|
|
'max_shots_per_target': maxShotsPerTarget,
|
|
'created_at': createdAt.toIso8601String(),
|
|
'notes': notes,
|
|
'distance': distance,
|
|
};
|
|
}
|
|
|
|
factory Session.fromMap(Map<String, dynamic> map, List<TargetAnalysis> analyses) {
|
|
return Session(
|
|
id: map['id'] as String,
|
|
weapon: map['weapon'] as String? ?? 'Inconnue',
|
|
weaponId: map['weapon_id'] as String?,
|
|
maxShotsPerTarget: map['max_shots_per_target'] as int? ?? 5,
|
|
analyses: analyses,
|
|
createdAt: DateTime.parse(map['created_at'] as String),
|
|
notes: map['notes'] as String?,
|
|
distance: map['distance'] as int? ?? 25,
|
|
);
|
|
}
|
|
|
|
@override
|
|
String toString() {
|
|
return 'Session(id: $id, weapon: $weapon, distance: ${distance}m, targets: ${analyses.length}, createdAt: $createdAt)';
|
|
}
|
|
}
|