*/ public static function values(): array { return array_map( static fn (self $lifecycle): string => $lifecycle->value, self::cases(), ); } public static function fromTenant(Tenant $tenant): self { if ($tenant->trashed()) { return self::Archived; } return self::fromValue($tenant->status); } public static function fromValue(mixed $value, self $default = self::Active): self { return self::tryFromValue($value) ?? $default; } public static function tryFromValue(mixed $value): ?self { $normalized = self::normalize($value); return $normalized === null ? null : self::tryFrom($normalized); } public static function normalize(mixed $value): ?string { if ($value === null) { return null; } if ($value instanceof BackedEnum) { $value = $value->value; } if ($value instanceof Stringable) { $value = (string) $value; } if (! is_string($value)) { return null; } $normalized = strtolower(trim($value)); $normalized = str_replace([' ', '-'], '_', $normalized); return match ($normalized) { 'pending' => self::Onboarding->value, default => $normalized !== '' ? $normalized : null, }; } public function label(): string { return match ($this) { self::Draft => 'Draft', self::Onboarding => 'Onboarding', self::Active => 'Active', self::Archived => 'Archived', }; } public function canSelectAsContext(): bool { return $this === self::Active; } public function canViewTenantSurface(): bool { return true; } public function canOperate(): bool { return $this === self::Active; } public function canArchive(): bool { return $this !== self::Archived; } public function canRestore(): bool { return $this === self::Archived; } public function canResumeOnboarding(): bool { return in_array($this, [self::Draft, self::Onboarding], true); } public function canReferenceInWorkspaceMonitoring(): bool { return true; } }