<?php

namespace App\Tests\Feature\Manga;

use App\Entity\Manga;
use App\Factory\ChapterFactory;
use App\Factory\MangaFactory;
use App\Tests\Feature\AbstractApiTestCase;
use Zenstruck\Foundry\Test\Factories;
use Zenstruck\Foundry\Test\ResetDatabase;

class GetMangaListTest extends AbstractApiTestCase
{
    use ResetDatabase, Factories;

    public function testGetEmptyMangaList(): void
    {
        // When
        $client = static::createClient();
        $response = $client->request('GET', '/api/mangas');

        // Then
        $this->assertResponseIsSuccessful();
        $this->assertJsonContains([
            'total' => 0,
            'page' => 1,
            'limit' => 20,
            'hasNextPage' => false,
            'hasPreviousPage' => false,
            'items' => []
        ]);
    }

    public function testGetMangaListWithPagination(): void
    {
        // Given
        $this->createMangas(25);

        // When
        $client = static::createClient();
        $response = $client->request('GET', '/api/mangas', [
            'query' => [
                'page' => 2,
                'limit' => 10
            ]
        ]);

        // Then
        $this->assertResponseIsSuccessful();
        $data = $response->toArray();

        $this->assertCount(10, $data['items']);
        $this->assertEquals(25, $data['total']);
        $this->assertEquals(2, $data['page']);
        $this->assertEquals(10, $data['limit']);
        $this->assertTrue($data['hasNextPage']);
        $this->assertTrue($data['hasPreviousPage']);
    }

    public function testGetMangaListWithSorting(): void
    {
        // Given
        $this->createManga('Manga B');
        $this->createManga('Manga A');
        $this->createManga('Manga C');

        // When
        $client = static::createClient();
        $response = $client->request('GET', '/api/mangas', [
            'query' => [
                'sortBy' => 'title',
                'sortOrder' => 'asc'
            ]
        ]);

        // Then
        $this->assertResponseIsSuccessful();
        $data = $response->toArray();

        $this->assertCount(3, $data['items']);
        $this->assertEquals('Manga A', $data['items'][0]['title']);
        $this->assertEquals('Manga B', $data['items'][1]['title']);
        $this->assertEquals('Manga C', $data['items'][2]['title']);
    }

    public function testGetMangaListWithChapters(): void
    {
        // Given — manga with chapters triggers Doctrine EAGER loading of chapters collection
        // (regression: colonne pages_directory doit exister sinon 500)
        $manga = MangaFactory::createOne([
            'title' => 'One Piece',
            'slug' => 'one-piece',
            'imageUrl' => 'https://example.com/image.jpg',
            'thumbnailUrl' => 'https://example.com/thumb.jpg',
        ]);
        ChapterFactory::createOne([
            'manga' => $manga,
            'number' => 1.0,
            'title' => 'Romance Dawn',
            'volume' => 1,
            'visible' => true,
        ]);

        // When
        $client = static::createClient();
        $client->request('GET', '/api/mangas');

        // Then — doit retourner 200 même avec des chapitres (eager loading OK)
        $this->assertResponseIsSuccessful();
        $data = $client->getResponse()->toArray();
        $this->assertEquals(1, $data['total']);
    }

    private function createMangas(int $count): void
    {
        for ($i = 1; $i <= $count; $i++) {
            $this->createManga("Manga $i");
        }
    }

    private function createManga(string $title): void
    {
        $manga = new Manga();
        $manga->setTitle($title)
            ->setSlug(strtolower(str_replace(' ', '-', $title)))
            ->setDescription('Description test')
            ->setAuthor('Author test')
            ->setPublicationYear(2020)
            ->setGenres(['action'])
            ->setStatus('ongoing')
            ->setRating(4.5)
            ->setMonitored(false)
            ->setImageUrl('https://via.placeholder.com/150')
            ->setThumbnailUrl('https://via.placeholder.com/150')
            ->setCreatedAt(new \DateTimeImmutable('2020-01-01'));

        $this->entityManager->persist($manga);
        $this->entityManager->flush();
    }
}
