<?php

namespace App\Tests\Domain\Scraping\Adapter;

use App\Domain\Scraping\Domain\Contract\Repository\SourceRepositoryInterface;
use App\Domain\Scraping\Domain\Model\Source;
use App\Domain\Scraping\Domain\Model\ValueObject\SourceId;
use DateTimeImmutable;

class InMemorySourceRepository implements SourceRepositoryInterface
{
    private array $sources = [];

    public function __construct()
    {
        // Ajoute une source par défaut pour les tests
        $this->sources['test-source'] = new Source(
            new SourceId('test-source'),
            'Test Source',
            'A test source',
            'https://example.com',
            [
                'imageSelector' => 'img.manga-image',
                'nextPageSelector' => null,
                'chapterUrlFormat' => 'https://example.com/manga/{slug}/chapter-{chapterNumber}',
                'scrapingType' => 'html',
                'chapterSelector' => '.chapter-item'
            ],
            true,
            new DateTimeImmutable(),
            new DateTimeImmutable()
        );
    }

    public function getById(string $id): ?Source
    {
        return $this->sources[$id] ?? null;
    }

    /**
     * @return Source[]
     */
    public function getAll(): array
    {
        return array_values($this->sources);
    }

    public function save(Source $source): void
    {
        $this->sources[$source->getId()->getValue()] = $source;
    }

    public function validateSourcesExist(array $sourceIds): bool
    {
        foreach ($sourceIds as $sourceId) {
            $source = $this->sources[$sourceId] ?? null;
            if (!$source || !$source->isActive()) {
                return false;
            }
        }
        return true;
    }

    /**
     * @return Source[]
     */
    public function getByIds(array $sourceIds): array
    {
        $sources = [];
        foreach ($sourceIds as $sourceId) {
            if (isset($this->sources[$sourceId])) {
                $sources[] = $this->sources[$sourceId];
            }
        }
        return $sources;
    }

    /**
     * @return Source[]
     */
    public function getAllActive(): array
    {
        return array_filter(
            array_values($this->sources),
            fn(Source $source) => $source->isActive()
        );
    }

    public function clear(): void
    {
        $this->sources = [];
    }
}
