import { ScheduleAppointment } from '../admin.models'; export type ScheduleStatusTone = | 'status-upcoming' | 'status-live' | 'status-coach-ended' | 'status-confirmed' | 'status-completed' | 'status-archived' | 'status-overdue' | 'status-cancelled' | 'status-neutral'; export type ScheduleStatusFilter = | 'all' | 'upcoming' | 'live' | 'coach-ended' | 'confirmed' | 'completed' | 'archived' | 'overdue' | 'cancelled' | 'unassigned'; const scheduleStatusLabels: Partial> = { 0: '待开始', 10: '上课中', 11: '陪练已结束', 20: '学员已确认', 30: '已完课', 40: '已归档', }; export function scheduleStatusTone( item: Pick, now = Date.now(), ): ScheduleStatusTone { if (item.cancelled) return 'status-cancelled'; const endTime = Date.parse(item.endsAt); if ((item.statusCode === 0 || item.statusCode === 10) && Number.isFinite(endTime) && endTime < now) return 'status-overdue'; if (item.statusCode === 0) return 'status-upcoming'; if (item.statusCode === 10) return 'status-live'; if (item.statusCode === 11) return 'status-coach-ended'; if (item.statusCode === 20) return 'status-confirmed'; if (item.statusCode === 30) return 'status-completed'; if (item.statusCode === 40) return 'status-archived'; return 'status-neutral'; } export function scheduleStatusLabel( item: Pick, now = Date.now(), ): string { const tone = scheduleStatusTone(item, now); if (tone === 'status-cancelled') return '已取消'; if (tone === 'status-overdue') return '逾期未完成'; return scheduleStatusLabels[item.statusCode] || item.statusLabel || `状态 ${item.statusCode}`; } export function scheduleMatchesStatus( item: Pick, filter: ScheduleStatusFilter, now = Date.now(), ): boolean { if (filter === 'all') return true; if (filter === 'unassigned') return !item.coachId || item.coachAccountMissing === true; return scheduleStatusTone(item, now) === `status-${filter}`; }