import 'package:equatable/equatable.dart'; import 'user.dart'; enum BetStatus { active('ACTIVE'), awaitingValidation('AWAITING_VALIDATION'), completed('COMPLETED'), expired('EXPIRED'); final String value; const BetStatus(this.value); static BetStatus fromString(String value) { return BetStatus.values.firstWhere( (e) => e.value == value, orElse: () => BetStatus.active, ); } } enum BetRole { participant('PARTICIPANT'), observer('OBSERVER'); final String value; const BetRole(this.value); static BetRole fromString(String value) { return BetRole.values.firstWhere( (e) => e.value == value, orElse: () => BetRole.observer, ); } } class BetParticipant extends Equatable { final User user; final BetRole role; const BetParticipant({ required this.user, required this.role, }); factory BetParticipant.fromJson(Map json) { return BetParticipant( user: User.fromJson(json['user'] as Map), role: BetRole.fromString(json['role'] as String), ); } Map toJson() { return { 'user': user.toJson(), 'role': role.value, }; } @override List get props => [user, role]; } class Bet extends Equatable { final String id; final String title; final String description; final List participants; final BetStatus status; final DateTime startDate; final DateTime? endDate; final bool isPublic; final String? groupId; final String stake; final User? winner; const Bet({ required this.id, required this.title, required this.description, required this.participants, required this.status, required this.startDate, this.endDate, required this.isPublic, this.groupId, required this.stake, this.winner, }); factory Bet.fromJson(Map json) { return Bet( id: json['id'] as String, title: json['title'] as String, description: json['description'] as String, participants: (json['participants'] as List) .map((p) => BetParticipant.fromJson(p as Map)) .toList(), status: BetStatus.fromString(json['status'] as String), startDate: DateTime.parse(json['startDate'] as String), endDate: json['endDate'] != null ? DateTime.parse(json['endDate'] as String) : null, isPublic: json['isPublic'] as bool, groupId: json['groupId'] as String?, stake: json['stake'] as String, winner: json['winner'] != null ? User.fromJson(json['winner'] as Map) : null, ); } Map toJson() { return { 'id': id, 'title': title, 'description': description, 'participants': participants.map((p) => p.toJson()).toList(), 'status': status.value, 'startDate': startDate.toIso8601String(), 'endDate': endDate?.toIso8601String(), 'isPublic': isPublic, 'groupId': groupId, 'stake': stake, 'winner': winner?.toJson(), }; } @override List get props => [ id, title, description, participants, status, startDate, endDate, isPublic, groupId, stake, winner, ]; }