. */ declare(strict_types=1); namespace App\Services\InfoProviderSystem\DTOs; /** * Represents the complete response from a bulk info provider search operation. * This DTO provides type safety and clear structure instead of complex arrays. */ readonly class BulkSearchResponseDTO { /** * @param PartSearchResultDTO[] $partResults Array of search results for each part */ public function __construct( public array $partResults ) {} /** * Create from legacy array format for backwards compatibility. * @param array $data Array of part result arrays in legacy format */ public static function fromArray(array $data): self { $partResults = []; foreach ($data as $partData) { $partResults[] = PartSearchResultDTO::fromArray($partData); } return new self($partResults); } /** * Convert to legacy array format for backwards compatibility. */ public function toArray(): array { $result = []; foreach ($this->partResults as $partResult) { $result[] = $partResult->toArray(); } return $result; } /** * Check if any parts have search results. */ public function hasAnyResults(): bool { foreach ($this->partResults as $partResult) { if ($partResult->hasResults()) { return true; } } return false; } /** * Get the total number of search results across all parts. */ public function getTotalResultCount(): int { $count = 0; foreach ($this->partResults as $partResult) { $count += $partResult->getResultCount(); } return $count; } /** * Get all parts that have search results. * @return PartSearchResultDTO[] */ public function getPartsWithResults(): array { return array_filter($this->partResults, fn($result) => $result->hasResults()); } /** * Get all parts that have errors. * @return PartSearchResultDTO[] */ public function getPartsWithErrors(): array { return array_filter($this->partResults, fn($result) => $result->hasErrors()); } /** * Get the number of parts processed. */ public function getPartCount(): int { return count($this->partResults); } /** * Get the number of parts with successful results. */ public function getSuccessfulPartCount(): int { return count($this->getPartsWithResults()); } }