<?php

namespace App\Tests\Feature\Manga;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Symfony\Component\HttpFoundation\File\UploadedFile;

class ImportVolumeTest extends WebTestCase
{
    private const API_ENDPOINT = '/api/volumes/import';

    public function testItReturns404WhenMangaNotFound(): void
    {
        $client = static::createClient();
        $file = $this->createValidCbzFile();

        $client->request(
            'POST',
            self::API_ENDPOINT,
            [
                'mangaId' => 'non-existent-manga-id',
                'volumeNumber' => '1',
            ],
            ['file' => $file],
            ['CONTENT_TYPE' => 'multipart/form-data']
        );

        $this->assertResponseStatusCodeSame(404);
        $response = json_decode($client->getResponse()->getContent(), true);
        $this->assertEquals('Manga not found', $response['error']);
    }

    public function testItReturns422WhenMangaIdIsMissing(): void
    {
        $client = static::createClient();
        $file = $this->createValidCbzFile();

        $client->request(
            'POST',
            self::API_ENDPOINT,
            [
                'volumeNumber' => '1',
            ],
            ['file' => $file],
            ['CONTENT_TYPE' => 'multipart/form-data']
        );

        $this->assertResponseStatusCodeSame(422);
        $response = json_decode($client->getResponse()->getContent(), true);
        $this->assertStringContainsString('mangaId is required', $response[0]['message']);
    }

    public function testItReturns422WhenVolumeNumberIsMissing(): void
    {
        $client = static::createClient();
        $file = $this->createValidCbzFile();

        $client->request(
            'POST',
            self::API_ENDPOINT,
            [
                'mangaId' => 'some-manga-id',
            ],
            ['file' => $file],
            ['CONTENT_TYPE' => 'multipart/form-data']
        );

        $this->assertResponseStatusCodeSame(422);
        $response = json_decode($client->getResponse()->getContent(), true);
        $this->assertStringContainsString('volumeNumber is required', $response[0]['message']);
    }

    public function testItReturns422WhenFileIsMissing(): void
    {
        $client = static::createClient();

        $client->request(
            'POST',
            self::API_ENDPOINT,
            [
                'mangaId' => 'some-manga-id',
                'volumeNumber' => '1',
            ],
            [],
            ['CONTENT_TYPE' => 'multipart/form-data']
        );

        $this->assertResponseStatusCodeSame(422);
        $response = json_decode($client->getResponse()->getContent(), true);
        $this->assertStringContainsString('Please upload a file', $response[0]['message']);
    }

    public function testItReturns422WhenFileIsNotCbz(): void
    {
        $client = static::createClient();

        $tempFile = tempnam(sys_get_temp_dir(), 'test_');
        file_put_contents($tempFile, 'This is not a CBZ file');
        $file = new UploadedFile($tempFile, 'test.txt', 'text/plain', null, true);

        $client->request(
            'POST',
            self::API_ENDPOINT,
            [
                'mangaId' => 'some-manga-id',
                'volumeNumber' => '1',
            ],
            ['file' => $file],
            ['CONTENT_TYPE' => 'multipart/form-data']
        );

        $this->assertResponseStatusCodeSame(422);
        $response = json_decode($client->getResponse()->getContent(), true);
        $this->assertStringContainsString('valid CBZ file', $response[0]['message']);
    }

    private function createValidCbzFile(): UploadedFile
    {
        $tmpFile = tempnam(sys_get_temp_dir(), 'cbz_');
        unlink($tmpFile);

        $zip = new \ZipArchive();
        if (true !== $zip->open($tmpFile, \ZipArchive::CREATE | \ZipArchive::OVERWRITE)) {
            throw new \RuntimeException('Cannot create test CBZ file');
        }

        $zip->addFromString('image1.jpg', 'fake-image-data');
        $zip->close();

        return new UploadedFile($tmpFile, 'test-volume.cbz', 'application/x-cbz', null, true);
    }
}
