'Order Placed', self::CONFIRMED => 'Order Confirmed', self::PREPARING => 'Preparing', self::READY_FOR_PICKUP => 'Ready for Pickup', self::RIDER_ASSIGNED => 'Rider Assigned', self::RIDER_AT_RESTAURANT => 'Rider at Restaurant', self::PICKED_UP => 'Picked Up', self::ON_THE_WAY => 'On The Way', self::ARRIVED => 'Arrived', self::DELIVERED => 'Delivered', self::CANCELLED => 'Cancelled', self::FAILED => 'Failed', }; } public function description(): string { return match ($this) { self::PENDING => 'Waiting for restaurant confirmation', self::CONFIRMED => 'Restaurant is preparing your food', self::PREPARING => 'Your food is being prepared', self::READY_FOR_PICKUP => 'Food is ready, waiting for rider', self::RIDER_ASSIGNED => 'A rider has been assigned', self::RIDER_AT_RESTAURANT => 'Rider has arrived at restaurant', self::PICKED_UP => 'Rider has picked up your order', self::ON_THE_WAY => 'Rider is on the way to you', self::ARRIVED => 'Rider has arrived at your location', self::DELIVERED => 'Order has been delivered', self::CANCELLED => 'Order has been cancelled', self::FAILED => 'Delivery failed', }; } public function color(): string { return match ($this) { self::PENDING => '#6B7280', self::CONFIRMED => '#3B82F6', self::PREPARING => '#F59E0B', self::READY_FOR_PICKUP => '#8B5CF6', self::RIDER_ASSIGNED => '#06B6D4', self::RIDER_AT_RESTAURANT => '#14B8A6', self::PICKED_UP => '#22C55E', self::ON_THE_WAY => '#10B981', self::ARRIVED => '#059669', self::DELIVERED => '#047857', self::CANCELLED => '#EF4444', self::FAILED => '#DC2626', }; } public function icon(): string { return match ($this) { self::PENDING => 'clock', self::CONFIRMED => 'check-circle', self::PREPARING => 'fire', self::READY_FOR_PICKUP => 'package', self::RIDER_ASSIGNED => 'user-check', self::RIDER_AT_RESTAURANT => 'map-pin', self::PICKED_UP => 'shopping-bag', self::ON_THE_WAY => 'truck', self::ARRIVED => 'home', self::DELIVERED => 'check-double', self::CANCELLED => 'x-circle', self::FAILED => 'alert-triangle', }; } public function canTransitionTo(DeliveryStatus $newStatus): bool { $allowedTransitions = match ($this) { self::PENDING => [self::CONFIRMED, self::CANCELLED], self::CONFIRMED => [self::PREPARING, self::CANCELLED], self::PREPARING => [self::READY_FOR_PICKUP, self::CANCELLED], self::READY_FOR_PICKUP => [self::RIDER_ASSIGNED, self::CANCELLED], self::RIDER_ASSIGNED => [self::RIDER_AT_RESTAURANT, self::CANCELLED, self::READY_FOR_PICKUP], // Can reassign self::RIDER_AT_RESTAURANT => [self::PICKED_UP, self::CANCELLED], self::PICKED_UP => [self::ON_THE_WAY, self::FAILED], self::ON_THE_WAY => [self::ARRIVED, self::FAILED], self::ARRIVED => [self::DELIVERED, self::FAILED], self::DELIVERED => [], self::CANCELLED => [], self::FAILED => [], }; return in_array($newStatus, $allowedTransitions); } public function isActive(): bool { return ! in_array($this, [self::DELIVERED, self::CANCELLED, self::FAILED]); } public function isCompleted(): bool { return $this === self::DELIVERED; } public function isCancelled(): bool { return $this === self::CANCELLED; } public function isFailed(): bool { return $this === self::FAILED; } public function isPickedUp(): bool { return in_array($this, [self::PICKED_UP, self::ON_THE_WAY, self::ARRIVED, self::DELIVERED]); } public function requiresRider(): bool { return in_array($this, [ self::RIDER_ASSIGNED, self::RIDER_AT_RESTAURANT, self::PICKED_UP, self::ON_THE_WAY, self::ARRIVED, ]); } public function isTrackable(): bool { return in_array($this, [ self::RIDER_ASSIGNED, self::RIDER_AT_RESTAURANT, self::PICKED_UP, self::ON_THE_WAY, self::ARRIVED, ]); } public static function activeStatuses(): array { return [ self::PENDING, self::CONFIRMED, self::PREPARING, self::READY_FOR_PICKUP, self::RIDER_ASSIGNED, self::RIDER_AT_RESTAURANT, self::PICKED_UP, self::ON_THE_WAY, self::ARRIVED, ]; } public static function completedStatuses(): array { return [self::DELIVERED, self::CANCELLED, self::FAILED]; } public static function riderActiveStatuses(): array { return [ self::RIDER_ASSIGNED, self::RIDER_AT_RESTAURANT, self::PICKED_UP, self::ON_THE_WAY, self::ARRIVED, ]; } public function sortOrder(): int { return match ($this) { self::PENDING => 1, self::CONFIRMED => 2, self::PREPARING => 3, self::READY_FOR_PICKUP => 4, self::RIDER_ASSIGNED => 5, self::RIDER_AT_RESTAURANT => 6, self::PICKED_UP => 7, self::ON_THE_WAY => 8, self::ARRIVED => 9, self::DELIVERED => 10, self::CANCELLED => 11, self::FAILED => 12, }; } }