priority = $priority ?? new DomainPriority(); if ($registerDefaults) { $this->registerDefaults(); } } public function register(DomainProviderInterface $provider): void { $this->registerDefinition( $provider->getName(), $provider->getSupportedDomains(), $provider->getSupportedIdentifiers(), $provider->getPriority(), $provider->getConfidence() ); } public function registerDefinition( string $name, array $supportedDomains, array $supportedIdentifiers, int $priority, float $confidence, bool $future = false ): void { $key = strtolower(trim($name)); if ($key === '') { throw new \InvalidArgumentException('Provider name cannot be empty.'); } $this->providers[$key] = [ 'name' => trim($name), 'supported_domains' => array_values($supportedDomains), 'supported_identifiers' => array_values($supportedIdentifiers), 'priority' => $priority, 'confidence' => max(0.0, min(1.0, $confidence)), 'future' => $future, ]; } public function getAll(): array { return $this->priority->rank(array_values($this->providers)); } public function getCandidates(string $domain, string $identifierType): array { $candidates = array_filter($this->providers, static function (array $provider) use ($domain, $identifierType): bool { return in_array($domain, $provider['supported_domains'], true) && in_array($identifierType, $provider['supported_identifiers'], true); }); return $this->priority->rank(array_values($candidates)); } private function registerDefaults(): void { foreach (\TFGraphics\SmartImport\Providers\Foundation\RuntimeProviderCatalog::policy('domain_definitions') as $definition) { $this->registerDefinition(...$definition); } } }