mustSuggestArgumentValuesFor('identifier')) { $this->clientResolver->complete($suggestions); } if ($input->mustSuggestArgumentValuesFor('status')) { $suggestions->suggestValues([ new Suggestion('activate', 'Activate the client'), new Suggestion('deactivate', 'Deactivate the client'), ]); } } public function handle( SetClientStatus $usecase, UsecaseExecutor $executor, ): int { $input = $this->getInput(); if ($input === null) { return self::FAILURE; } try { $view = UsecaseBuilder::using($executor) ->do($usecase) ->from($input) ->with(new SetClientStatusPresenter()) ->run(); $this->info($view->message); return self::SUCCESS; } catch (ClientNotFoundException | \InvalidArgumentException $e) { $this->error($e->getMessage()); return self::FAILURE; } } private function getInput(): ?Input { $client = $this->resolveClient(); if ($client === null) { return null; } try { $desiredStatus = $this->resolveDesiredStatus($client); return new Input($client->identifier, $desiredStatus); } catch (\InvalidArgumentException $e) { $this->error($e->getMessage()); return null; } } private function resolveClient(): ?Client { $raw = $this->argument('identifier'); $rawString = is_string($raw) ? $raw : $this->anticipate( 'Search client (by name, ID, identifier, or slug):', fn (string $input): array => $this->clientResolver->searchSuggestions($input), ); if (! is_string($rawString) || trim($rawString) === '') { $this->error('No client specified.'); return null; } $inputString = trim($rawString); $client = $this->clientResolver->find($inputString); if ($client === null) { try { new ClientIdentifier($inputString); $this->error("Client '{$inputString}' not found."); } catch (\InvalidArgumentException) { $this->error("Invalid client identifier '{$inputString}'. Expected a valid client identifier."); } return null; } return $client; } private function resolveDesiredStatus(Client $client): bool { $status = $this->argument('status') !== null ? (string) $this->argument('status') : null; return match ($status) { 'activate' => true, 'deactivate' => false, null => ! $client->isActive, default => throw new \InvalidArgumentException("Invalid status '{$status}'. Expected 'activate' or 'deactivate'."), }; } }