<?php

namespace App\Tests\Domain\Manga\Infrastructure\Provider;

use App\Domain\Manga\Domain\Contract\Client\MangadexClientInterface;
use App\Domain\Manga\Infrastructure\Provider\MangadexProvider;
use PHPUnit\Framework\TestCase;
use Symfony\Component\String\Slugger\AsciiSlugger;

class MangadexProviderTest extends TestCase
{
    private MangadexClientInterface $client;
    private MangadexProvider $provider;

    protected function setUp(): void
    {
        $this->client = $this->createMock(MangadexClientInterface::class);
        $this->provider = new MangadexProvider(
            $this->client,
            new AsciiSlugger()
        );
    }

    public function testSearchWithNoResults(): void
    {
        $this->client->method('searchManga')
            ->willReturn(['data' => []]);

        $result = $this->provider->search('test');
        $this->assertCount(0, $result->getItems());
    }

    public function testSearchWithResults(): void
    {
        $this->client->method('searchManga')
            ->willReturn([
                'data' => [
                    [
                        'id' => '123',
                        'attributes' => [
                            'title' => ['en' => 'Test Manga'],
                            'description' => ['en' => 'Test description'],
                            'year' => 2020,
                            'status' => 'ongoing',
                            'tags' => [
                                ['attributes' => ['name' => ['en' => 'Action']]]
                            ]
                        ],
                        'relationships' => [
                            [
                                'type' => 'author',
                                'attributes' => ['name' => 'Test Author']
                            ],
                            [
                                'type' => 'cover_art',
                                'attributes' => ['fileName' => 'cover.jpg']
                            ]
                        ]
                    ]
                ]
            ]);

        $this->client->method('getMangaRatings')
            ->willReturn([
                'statistics' => [
                    '123' => [
                        'rating' => ['average' => 4.5]
                    ]
                ]
            ]);

        $result = $this->provider->search('test');
        $mangas = $result->getItems();

        $this->assertCount(1, $mangas);
        $manga = $mangas[0];
        
        $this->assertEquals('Test Manga', $manga->getTitle()->getValue());
        $this->assertEquals('test-manga', $manga->getSlug()->getValue());
        $this->assertEquals('Test description', $manga->getDescription());
        $this->assertEquals('Test Author', $manga->getAuthor());
        $this->assertEquals(2020, $manga->getPublicationYear());
        $this->assertEquals(['Action'], $manga->getGenres());
        $this->assertEquals('ongoing', $manga->getStatus());
        $this->assertEquals('123', $manga->getExternalId()->getValue());
        $this->assertEquals(4.5, $manga->getRating());
    }

    public function testSearchWithInvalidData(): void
    {
        $this->client->method('searchManga')
            ->willReturn([
                'data' => [
                    [
                        'id' => '123',
                        'attributes' => [
                            // Missing required 'title' field
                            'description' => ['en' => 'Test description']
                        ],
                        'relationships' => []
                    ]
                ]
            ]);

        $result = $this->provider->search('test');
        $this->assertCount(0, $result->getItems());
    }
} 