'notify_on_upcoming_flight_added', self::Logged => 'notify_on_historic_flight_added', self::Cancelled => 'notify_on_flight_cancellation', self::Departed => 'notify_on_flight_departure', self::Arrived => 'notify_on_flight_arrival', }; } public function title(User $user): string { return match ($this) { self::Booked => "{$user->name} booked a new flight", self::Logged => "{$user->name} logged a historic flight", self::Cancelled => "{$user->name} cancelled a flight", self::Departed => "{$user->name} is taking off!", self::Arrived => "{$user->name} has landed!", }; } public function body(UserFlight $flight): string { $flightNumber = $flight->flight_number ? "{$flight->flight_number} from" : 'From'; return match ($this) { self::Departed => "{$flightNumber} {$flight->departureAirport->municipality} → {$flight->arrivalAirport->municipality}", self::Arrived => "In {$flight->arrivalAirport->municipality}", default => "{$flightNumber} {$flight->departureAirport->municipality} ({$flight->departureAirport->display_code}) → " . "{$flight->arrivalAirport->municipality} ({$flight->arrivalAirport->display_code}) on {$flight->departure_date_display}", }; } public function url(UserFlight $flight): string { return match ($this) { self::Cancelled => route('profile.view', [$flight->user->name]), self::Departed, self::Arrived => route('profile.flight', ['user' => $flight->user->name, 'userFlight' => $flight->id]), default => route('profile.departure-board', [$flight->user->name, $flight->id]), }; } public static function forCreation(UserFlight $flight): self { return $flight->departure_date->isFuture() ? self::Booked : self::Logged; } }