<?php

namespace App\Tests\Feature\Conversion;

use App\Tests\Feature\AbstractApiTestCase;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Zenstruck\Foundry\Test\ResetDatabase;

class ConvertFileTest extends AbstractApiTestCase
{
    use ResetDatabase;

    public function testConvertCbrToCbzSuccess(): void
    {
        // Given - Créer un fichier CBR temporaire pour le test
        $tempCbrFile = $this->createTestCbrFile();

        // When - Envoyer la requête avec VichUploader et la syntaxe correcte
        $client = static::createClient();

        $uploadedFile = new UploadedFile(
            $tempCbrFile,
            'test-manga.cbr',
            'application/x-cbr',  // Type MIME attendu par la validation
            null,
            true
        );

        $client->request('POST', '/api/conversions/convert', [
            'headers' => ['Content-Type' => 'multipart/form-data'],
            'extra' => [
                'files' => [
                    'file' => $uploadedFile,
                ],
            ]
        ]);

        // Then - Vérifier la réponse
        $this->assertResponseIsSuccessful();
        $this->assertResponseHeaderSame('Content-Type', 'application/x-cbz');
        $this->assertResponseHeaderSame('Content-Disposition', 'attachment; filename=test-manga.cbz');

        // Vérifier que la réponse contient le fichier converti
        $content = $client->getResponse()->getContent();
        $this->assertNotEmpty($content);

        // Nettoyer le fichier temporaire
        if (file_exists($tempCbrFile)) {
            unlink($tempCbrFile);
        }
    }

    public function testConvertWithoutFileReturnsError(): void
    {
        // When - Envoyer une requête sans fichier
        $client = static::createClient();
        $client->request('POST', '/api/conversions/convert', [
            'headers' => ['Content-Type' => 'multipart/form-data'],
        ]);

        // Then - Vérifier l'erreur de validation
        $this->assertResponseStatusCodeSame(422);
    }

    public function testConvertWithInvalidFileFormatReturnsError(): void
    {
        // Given - Créer un fichier non-CBR pour le test
        $tempFile = tempnam(sys_get_temp_dir(), 'test_invalid_');
        file_put_contents($tempFile, 'invalid content');

        $uploadedFile = new UploadedFile(
            $tempFile,
            'test.txt',
            'text/plain',
            null,
            true
        );

        // When - Envoyer la requête avec un fichier invalide
        $client = static::createClient();
        $client->request('POST', '/api/conversions/convert', [
            'headers' => ['Content-Type' => 'multipart/form-data'],
            'extra' => [
                'files' => [
                    'file' => $uploadedFile,
                ],
            ]
        ]);

        // Then - Vérifier l'erreur de validation
        $this->assertResponseStatusCodeSame(422);

        // Nettoyer le fichier temporaire
        if (file_exists($tempFile)) {
            unlink($tempFile);
        }
    }

    public function testConvertWithFileTooLargeReturnsError(): void
    {
        // Given - Créer un fichier trop volumineux (simulation)
        $tempLargeFile = tempnam(sys_get_temp_dir(), 'test_large_');

        // Créer un fichier de plus de 150MB (pour déclencher l'erreur de taille)
        // On simule juste en créant un fichier et en modifiant sa taille déclarée
        file_put_contents($tempLargeFile, str_repeat('x', 1024 * 1024)); // 1MB de contenu

        // Mock de l'UploadedFile avec une taille déclarée trop importante
        $uploadedFile = new UploadedFile(
            $tempLargeFile,
            'large-file.cbr',
            'application/x-cbr',  // Type MIME attendu par la validation
            150 * 1024 * 1024 + 1 // 150MB + 1 byte
        );

        // When - Envoyer la requête avec un fichier trop volumineux
        $client = static::createClient();
        $client->request('POST', '/api/conversions/convert', [
            'headers' => ['Content-Type' => 'multipart/form-data'],
            'extra' => [
                'files' => [
                    'file' => $uploadedFile,
                ],
            ]
        ]);

        // Then - Vérifier l'erreur de validation
        $this->assertResponseStatusCodeSame(422);

        // Nettoyer le fichier temporaire
        if (file_exists($tempLargeFile)) {
            unlink($tempLargeFile);
        }
    }

    private function createTestCbrFile(): string
    {
        // Créer un fichier CBR temporaire pour les tests
        $tempFile = tempnam(sys_get_temp_dir(), 'test_cbr_');

        // Pour les tests, on peut simplement créer un fichier avec une extension .cbr
        // En production, ce serait un vrai fichier RAR
        $newPath = $tempFile . '.cbr';
        rename($tempFile, $newPath);

        // Utiliser un fichier CBZ existant comme base et le renommer en CBR pour les tests
        $existingCbzFile = __DIR__ . '/../../Fixtures/chapter.cbz';
        if (file_exists($existingCbzFile)) {
            copy($existingCbzFile, $newPath);
        } else {
            // Fallback: créer un fichier ZIP simple avec extension CBR
            // Un fichier CBR est essentiellement un fichier RAR, mais pour les tests on peut simuler avec un ZIP
            $zip = new \ZipArchive();
            if ($zip->open($newPath, \ZipArchive::CREATE) === TRUE) {
                $zip->addFromString('test.txt', 'Test content for CBR simulation');
                $zip->close();
            }
        }

        return $newPath;
    }
}
