identifier = $identifier; $this->domain = $domain; $this->providerPlan = $providerPlan; $this->planningTimeMs = round(max(0.0, $planningTimeMs), 4); $this->error = $error; $this->providerTrace = $providerTrace; $this->executionTimeMs = round(max(0.0, $executionTimeMs), 4); $this->executionError = $executionError; } public function getIdentifier(): ?IdentifierResult { return $this->identifier; } public function getDomain(): ?DomainCapabilities { return $this->domain; } public function getProviderPlan(): ?ProviderExecutionPlan { return $this->providerPlan; } public function getPlanningTimeMs(): float { return $this->planningTimeMs; } public function getError(): ?string { return $this->error; } public function toArray(): array { $selections = $this->providerPlan?->getSelections() ?? []; $executableSelections = array_values(array_filter( $selections, static fn ($selection): bool => $selection->isExecutable() )); $providerPriority = []; foreach ($executableSelections as $selection) { $providerPriority[$selection->getProviderName()] = $selection->getOrder(); } $executedProviders = array_values(array_filter(array_map( static fn ($trace): string => is_array($trace) && is_string($trace['provider'] ?? null) ? $trace['provider'] : '', $this->providerTrace ))); $executedKeys = array_map([$this, 'providerKey'], $executedProviders); $skippedProviders = []; foreach ($this->providerPlan?->getReasoning()->getDecisions() ?? [] as $decision) { $selection = $decision->getSelection(); $executable = $selection !== null && $selection->isExecutable(); $executed = in_array($this->providerKey($decision->getProviderName()), $executedKeys, true); if ($executable && $executed) { continue; } $skippedProviders[] = [ 'provider' => $decision->getProviderName(), 'reason' => $executable ? 'Selected provider was not registered, enabled, or executable at runtime.' : $decision->getReason(), ]; } return [ 'identifier_detected' => $this->identifier?->getIdentifierType(), 'identifier_normalized' => $this->identifier?->getNormalizedValue(), 'domain_detected' => $this->domain?->getDomain(), 'provider_execution_plan' => array_map( static fn ($selection): string => $selection->getProviderName(), $selections ), 'selected_providers' => array_map( static fn ($selection): string => $selection->getProviderName(), $executableSelections ), 'provider_priority' => $providerPriority, 'fallback_providers' => array_values(array_map( static fn ($selection): string => $selection->getProviderName(), array_filter($executableSelections, static fn ($selection): bool => $selection->getOrder() > 1) )), 'executed_providers' => $executedProviders, 'skipped_providers' => $skippedProviders, 'provider_trace' => $this->providerTrace, 'planning_time_ms' => $this->planningTimeMs, 'execution_time_ms' => $this->executionTimeMs, 'planning_error' => $this->error, 'execution_error' => $this->executionError, ]; } private function providerKey(string $name): string { return strtolower((string) preg_replace('/[^a-z0-9]+/i', '', trim($name))); } }