<?php

namespace App\Domain\Scraping\Application\CommandHandler;

use App\Domain\Scraping\Application\Command\SetMangaPreferredSources;
use App\Domain\Scraping\Domain\Contract\Repository\MangaRepositoryInterface;
use App\Domain\Scraping\Domain\Contract\Repository\SourceRepositoryInterface;

readonly class SetMangaPreferredSourcesHandler
{
    public function __construct(
        private MangaRepositoryInterface $mangaRepository,
        private SourceRepositoryInterface $sourceRepository
    ) {
    }

    public function handle(SetMangaPreferredSources $command): void
    {
        // 1. Vérifier que le manga existe
        $manga = $this->mangaRepository->getById($command->mangaId);
        if (!$manga) {
            throw new \InvalidArgumentException("Manga not found with ID: {$command->mangaId}");
        }

        // 2. Si pas de sources spécifiées, supprimer les sources préférées
        if (empty($command->sourceIds)) {
            $this->mangaRepository->updatePreferredSources($command->mangaId, []);
            return;
        }

        // 3. Valider que toutes les sources existent et sont actives
        if (!$this->sourceRepository->validateSourcesExist($command->sourceIds)) {
            throw new \InvalidArgumentException('One or more sources do not exist or are not active');
        }

        // 4. Sauvegarder les sources préférées dans l'ordre fourni
        $this->mangaRepository->updatePreferredSources($command->mangaId, $command->sourceIds);
    }
}
