<?php

namespace App\Tests\Feature\Manga;

use App\Tests\Factory\ChapterFactory;
use App\Tests\Factory\MangaFactory;
use App\Tests\Feature\AbstractApiTestCase;
use Symfony\Component\HttpFoundation\Response;
use Zenstruck\Foundry\Test\Factories;
use Zenstruck\Foundry\Test\ResetDatabase;

class DownloadVolumeTest extends AbstractApiTestCase
{
    use ResetDatabase;
    use Factories;

    public function testItDownloadsVolumeCbz(): void
    {
        // Arrange
        $manga = MangaFactory::createOne([
            'title' => 'One Piece',
            'slug' => 'one-piece',
        ]);

        // Create chapters for volume 1
        ChapterFactory::createMany(3, [
            'manga' => $manga,
            'volume' => 1,
            'visible' => true,
            'cbzPath' => __DIR__.'/../../Shared/Files/test-chapter.cbz',
        ]);

        $mangaId = $manga->getId();

        // Act
        static::createClient()->request('GET', "/api/mangas/{$mangaId}/volumes/1/download");

        // Assert
        $this->assertResponseIsSuccessful();
        $this->assertResponseHeaderSame('Content-Type', 'application/x-cbz');
        $contentDisposition = static::getClient()->getResponse()->headers->get('Content-Disposition');
        $this->assertStringContainsString('attachment; filename=', $contentDisposition);
        $this->assertStringContainsString('one-piece_vol1.cbz', $contentDisposition);
    }

    public function testItReturns404WhenMangaNotFound(): void
    {
        // Act
        static::createClient()->request('GET', '/api/mangas/999999/volumes/1/download');

        // Assert
        $this->assertResponseStatusCodeSame(Response::HTTP_NOT_FOUND);
    }

    public function testItReturns404WhenVolumeNotFound(): void
    {
        // Arrange
        $manga = MangaFactory::createOne([
            'title' => 'One Piece',
            'slug' => 'one-piece',
        ]);

        $mangaId = $manga->getId();

        // Act
        static::createClient()->request('GET', "/api/mangas/{$mangaId}/volumes/999/download");

        // Assert
        $this->assertResponseStatusCodeSame(Response::HTTP_NOT_FOUND);
    }

    public function testItReturns404WhenNoAvailableChaptersInVolume(): void
    {
        // Arrange
        $manga = MangaFactory::createOne([
            'title' => 'One Piece',
            'slug' => 'one-piece',
        ]);

        // Create chapters for volume 1 but all without CBZ files
        ChapterFactory::createMany(3, [
            'manga' => $manga,
            'volume' => 1,
            'visible' => true,
            'cbzPath' => null, // No CBZ files
        ]);

        $mangaId = $manga->getId();

        // Act
        static::createClient()->request('GET', "/api/mangas/{$mangaId}/volumes/1/download");

        // Assert
        $this->assertResponseStatusCodeSame(Response::HTTP_NOT_FOUND);
    }

    public function testItOnlyIncludesVisibleChaptersWithCbz(): void
    {
        // Arrange
        $manga = MangaFactory::createOne([
            'title' => 'One Piece',
            'slug' => 'one-piece',
        ]);

        // Create a mix of chapters
        ChapterFactory::createOne([
            'manga' => $manga,
            'volume' => 1,
            'number' => 1.0,
            'visible' => true,
            'cbzPath' => __DIR__.'/../../Shared/Files/test-chapter.cbz',
        ]);

        ChapterFactory::createOne([
            'manga' => $manga,
            'volume' => 1,
            'number' => 2.0,
            'visible' => false, // Soft deleted
            'cbzPath' => __DIR__.'/../../Shared/Files/test-chapter.cbz',
        ]);

        ChapterFactory::createOne([
            'manga' => $manga,
            'volume' => 1,
            'number' => 3.0,
            'visible' => true,
            'cbzPath' => null, // No CBZ
        ]);

        ChapterFactory::createOne([
            'manga' => $manga,
            'volume' => 1,
            'number' => 4.0,
            'visible' => true,
            'cbzPath' => __DIR__.'/../../Shared/Files/test-chapter.cbz',
        ]);

        $mangaId = $manga->getId();

        // Act
        static::createClient()->request('GET', "/api/mangas/{$mangaId}/volumes/1/download");

        // Assert - Should succeed with only 2 chapters (1 and 4)
        $this->assertResponseIsSuccessful();
    }
}
