chitfund/luckychit/lib/core/models/monthly_draw.dart

169 lines
5.1 KiB
Dart

import 'user.dart';
DateTime? _parseDrawDate(dynamic value) {
if (value == null) return null;
final s = value.toString().trim();
if (s.isEmpty) return null;
try {
return DateTime.parse(s);
} catch (_) {
return null;
}
}
class MonthlyDraw {
final String id;
final String groupId;
final int month;
final int year;
final DateTime drawDate;
final List<Map<String, dynamic>> eligibleMembers;
final String? winnerId;
final double prizeAmount;
final String serverSeed;
final String serverSeedHash;
final String clientSeed;
final int nonce;
final String resultHash;
final String status;
final String? notes;
final DateTime createdAt;
final DateTime updatedAt;
final User? winner;
MonthlyDraw({
required this.id,
required this.groupId,
required this.month,
required this.year,
required this.drawDate,
required this.eligibleMembers,
this.winnerId,
required this.prizeAmount,
required this.serverSeed,
required this.serverSeedHash,
required this.clientSeed,
required this.nonce,
required this.resultHash,
required this.status,
this.notes,
required this.createdAt,
required this.updatedAt,
this.winner,
});
factory MonthlyDraw.fromJson(Map<String, dynamic> json) {
final rawWinner = json['winner'];
Map<String, dynamic>? winnerMap;
if (rawWinner is Map<String, dynamic>) {
winnerMap = rawWinner;
} else if (rawWinner is Map) {
winnerMap = Map<String, dynamic>.from(rawWinner);
}
final drawDate =
_parseDrawDate(json['draw_date'] ?? json['drawDate']) ?? DateTime.fromMillisecondsSinceEpoch(0);
return MonthlyDraw(
id: json['id']?.toString() ?? '',
groupId: (json['group_id'] ?? json['groupId'])?.toString() ?? '',
month: _parseInt(json['month']),
year: _parseInt(json['year']),
drawDate: drawDate,
eligibleMembers: _parseEligibleMembers(json['eligible_members'] ?? json['eligibleMembers']),
winnerId: (json['winner_id'] ?? json['winnerId'])?.toString(),
prizeAmount: _parseDouble(json['prize_amount'] ?? json['prizeAmount']),
serverSeed: (json['server_seed'] ?? json['serverSeed'] ?? '').toString(),
serverSeedHash: (json['server_seed_hash'] ?? json['serverSeedHash'] ?? '').toString(),
clientSeed: (json['client_seed'] ?? json['clientSeed'] ?? '').toString(),
nonce: _parseInt(json['nonce']),
resultHash: (json['result_hash'] ?? json['resultHash'] ?? '').toString(),
status: json['status']?.toString() ?? 'pending',
notes: json['notes']?.toString(),
createdAt: _parseDrawDate(json['created_at'] ?? json['createdAt']) ?? DateTime.now(),
updatedAt: _parseDrawDate(json['updated_at'] ?? json['updatedAt']) ?? DateTime.now(),
winner: winnerMap != null ? User.fromJson(winnerMap) : null,
);
}
static double _parseDouble(dynamic value) {
if (value == null) return 0.0;
if (value is double) return value;
if (value is int) return value.toDouble();
if (value is String) {
try {
return double.parse(value);
} catch (e) {
print('Error parsing string to double: $value, error: $e');
return 0.0;
}
}
if (value is num) return value.toDouble();
print('Warning: Cannot parse $value (${value.runtimeType}) to double, returning 0.0');
return 0.0;
}
static int _parseInt(dynamic value) {
if (value == null) return 0;
if (value is int) return value;
if (value is String) {
try {
return int.parse(value);
} catch (e) {
print('Error parsing string to int: $value, error: $e');
return 0;
}
}
if (value is double) return value.toInt();
if (value is num) return value.toInt();
print('Warning: Cannot parse $value (${value.runtimeType}) to int, returning 0');
return 0;
}
static List<Map<String, dynamic>> _parseEligibleMembers(dynamic value) {
if (value == null) return [];
if (value is List) {
return value.map((item) {
if (item is Map<String, dynamic>) {
return item;
} else if (item is Map) {
return Map<String, dynamic>.from(item);
} else {
return <String, dynamic>{};
}
}).toList();
}
return [];
}
Map<String, dynamic> toJson() {
return {
'id': id,
'group_id': groupId,
'month': month,
'year': year,
'draw_date': drawDate.toIso8601String(),
'eligible_members': eligibleMembers,
'winner_id': winnerId,
'prize_amount': prizeAmount,
'server_seed': serverSeed,
'server_seed_hash': serverSeedHash,
'client_seed': clientSeed,
'nonce': nonce,
'result_hash': resultHash,
'status': status,
'notes': notes,
'created_at': createdAt.toIso8601String(),
'updated_at': updatedAt.toIso8601String(),
'winner': winner?.toJson(),
};
}
// Helper methods
bool get isPending => status == 'pending';
bool get isCompleted => status == 'completed';
bool get isCancelled => status == 'cancelled';
String get monthYear => '$month/$year';
}