<?php

declare(strict_types=1);

namespace OCA\RePod\Service;

use OCA\GPodderSync\Core\PodcastData\PodcastData;
use Psr\Log\LoggerInterface;

class MultiPodService implements IPodProvider
{
	/**
	 * @var IPodProvider[]
	 */
	private array $providers = [];

	public function __construct(
		FyydService $fyydService,
		ItunesService $itunesService,
		private readonly LoggerInterface $logger
	) {
		$this->providers = [$fyydService, $itunesService];
	}

	/**
	 * @return PodcastData[]
	 */
	public function search(string $value): array {
		$podcasts = [];

		foreach ($this->providers as $provider) {
			try {
				$podcasts = [...$podcasts, ...$provider->search($value)];
			} catch (\Exception $e) {
				$this->logger->error($e->getMessage(), $e->getTrace());
			}
		}

		usort($podcasts, fn (PodcastData $a, PodcastData $b): int => $b->getFetchedAtUnix() <=> $a->getFetchedAtUnix());

		return array_values(
			array_intersect_key(
				$podcasts,
				array_unique(
					array_map(
						fn (PodcastData $feed) => $feed->getLink(),
						array_filter($podcasts, fn (PodcastData $feed) => $feed->getLink())
					)
				)
			)
		);
	}
}