<?php

namespace App\Tests\Feature\Manga;

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

class ImportChapterTest extends WebTestCase
{
    private const API_ENDPOINT = '/api/chapters/import';

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

        $client->request(
            'POST',
            self::API_ENDPOINT,
            [
                'mangaId' => 'non-existent-manga-id',
                'chapterNumber' => '1.5'
            ],
            ['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 test_it_returns_422_when_manga_id_is_missing(): void
    {
        $client = static::createClient();
        $file = $this->createValidCbzFile();

        $client->request(
            'POST',
            self::API_ENDPOINT,
            [
                'chapterNumber' => '1.5'
            ],
            ['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 test_it_returns_422_when_chapter_number_is_missing(): 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('chapterNumber is required', $response[0]['message']);
    }

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

        $client->request(
            'POST',
            self::API_ENDPOINT,
            [
                'mangaId' => 'some-manga-id',
                'chapterNumber' => '1.5'
            ],
            [],
            ['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 test_it_returns_422_when_file_is_not_cbz(): 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',
                'chapterNumber' => '1.5'
            ],
            ['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 ($zip->open($tmpFile, \ZipArchive::CREATE | \ZipArchive::OVERWRITE) !== true) {
            throw new \RuntimeException('Cannot create test CBZ file');
        }

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

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