<?php

namespace App\Tests\Domain\Manga\Adapter;

use App\Domain\Manga\Domain\Contract\Client\MangadexClientInterface;

class InMemoryMangadexClient implements MangadexClientInterface
{
    private array $mangas = [];
    private array $feeds = [];
    private array $aggregates = [];

    public function __construct(
        array $mangas = [],
        array $feeds = [],
        array $aggregates = []
    ) {
        $this->mangas = $mangas;
        $this->feeds = $feeds;
        $this->aggregates = $aggregates;
    }

    public function authenticate(): void
    {
        // No need to implement for tests
    }

    public function refreshToken(): void
    {
        // No need to implement for tests
    }

    public function searchManga(string $title): array
    {
        $results = [];
        foreach ($this->mangas as $id => $manga) {
            if (isset($manga['attributes']['title']['en']) && 
                str_contains(
                    strtolower($manga['attributes']['title']['en']),
                    strtolower($title)
                )
            ) {
                $results[] = array_merge(['id' => $id], $manga);
            }
        }

        return ['data' => $results];
    }

    public function getMangaRatings(array $mangaIds): array
    {
        $statistics = [];
        foreach ($mangaIds as $id) {
            $statistics[$id] = [
                'rating' => ['average' => 4.5] // Default rating for tests
            ];
        }

        return ['statistics' => $statistics];
    }

    public function getMangaFeed(string $mangaId, int $offset = 0, int $limit = 500, string $order = 'asc'): array
    {
        if (!isset($this->feeds[$mangaId])) {
            return [
                'data' => [],
                'total' => 0
            ];
        }

        $feed = $this->feeds[$mangaId];
        if ($order === 'desc') {
            $feed = array_reverse($feed);
        }

        return [
            'data' => array_slice($feed, $offset, $limit),
            'total' => count($feed)
        ];
    }

    public function getMangaAggregate(string $mangaId): array
    {
        if (!isset($this->aggregates[$mangaId])) {
            return [
                'result' => 'ok',
                'volumes' => []
            ];
        }

        return [
            'result' => 'ok',
            'volumes' => $this->aggregates[$mangaId]
        ];
    }

    public function getManga(string $mangaId): array
    {
        if (!isset($this->mangas[$mangaId])) {
            return ['data' => null];
        }

        return [
            'result' => 'ok',
            'data' => array_merge(['id' => $mangaId], $this->mangas[$mangaId])
        ];
    }

    public function getMangaRecommendations(string $mangaId): array
    {
        return ['data' => []];
    }

    public function addManga(string $id, array $data): void
    {
        $this->mangas[$id] = $data;
    }

    public function addFeed(string $mangaId, array $feed): void
    {
        $this->feeds[$mangaId] = $feed;
    }

    public function addAggregate(string $mangaId, array $aggregate): void
    {
        $this->aggregates[$mangaId] = $aggregate;
    }
} 