MIF_E31222656/lib/models/crop_schedule.dart

103 lines
3.0 KiB
Dart

import 'package:flutter/material.dart';
import 'package:supabase_flutter/supabase_flutter.dart';
/// Fetches the active schedule for a user
Future<Map<String, dynamic>?> fetchActiveSchedule(String userId) async {
if (userId.isEmpty) {
debugPrint('fetchActiveSchedule: userId is empty');
return null;
}
try {
// Query the schedules table for active schedules
final response = await Supabase.instance.client
.from('schedules')
.select('*, crops(name)')
.eq('user_id', userId)
.eq('status', 'active')
.order('created_at', ascending: false)
.limit(1);
if (response.isEmpty) {
debugPrint('No active schedule found for user: $userId');
return null;
}
final schedule = response[0];
final cropName = schedule['crops']['name'] as String;
// Calculate progress and days left
final startDate = DateTime.parse(schedule['start_date']);
final endDate = DateTime.parse(schedule['end_date']);
final today = DateTime.now();
final totalDuration = endDate.difference(startDate).inDays;
final elapsedDuration = today.difference(startDate).inDays;
double progress = elapsedDuration / totalDuration;
progress = progress.clamp(0.0, 1.0); // Ensure progress is between 0 and 1
final daysLeft = endDate.difference(today).inDays;
// Get current phase
String? currentPhase;
try {
final phaseResponse = await Supabase.instance.client
.from('schedule_phases')
.select('phase_name')
.eq('schedule_id', schedule['id'])
.lte('start_date', today.toIso8601String())
.gte('end_date', today.toIso8601String())
.limit(1);
if (phaseResponse.isNotEmpty) {
currentPhase = phaseResponse[0]['phase_name'] as String;
}
} catch (e) {
debugPrint('Error fetching current phase: $e');
}
return {
'scheduleId': schedule['id'],
'cropName': cropName,
'startDate': startDate,
'endDate': endDate,
'progress': progress,
'daysLeft': daysLeft,
'currentPhase': currentPhase,
'status': schedule['status'],
};
} catch (e) {
debugPrint('Error fetching active schedule: $e');
return null;
}
}
/// Fetches recent schedules for a user
Future<List<Map<String, dynamic>>> fetchRecentSchedules(String userId) async {
if (userId.isEmpty) {
debugPrint('fetchRecentSchedules: userId is empty');
return [];
}
try {
final response = await Supabase.instance.client
.from('schedules')
.select('*, crops(name)')
.eq('user_id', userId)
.order('created_at', ascending: false)
.limit(5);
return response.map<Map<String, dynamic>>((schedule) {
return {
'scheduleId': schedule['id'],
'cropName': schedule['crops']['name'] as String,
'status': schedule['status'],
'date': DateTime.parse(schedule['created_at']),
};
}).toList();
} catch (e) {
debugPrint('Error fetching recent schedules: $e');
return [];
}
}