<?php

namespace Zoomyboy\MedialibraryHelper\Tests\Feature;

use Carbon\Carbon;
use Illuminate\Support\Facades\Storage;

test('it uploads a deferred file to a collection', function () {
    $this->auth()->registerModel()->withoutExceptionHandling();

    test()->postJson('/mediaupload', [
        'parent' => ['model' => 'post', 'collection_name' => 'defaultSingleFile', 'id' => null],
        'payload' => ['content' => base64_encode(test()->pdfFile()->getContent()), 'name' => 'beispiel.pdf'],
    ])
        ->assertStatus(201)
        ->assertExactJson([
            'is_deferred' => true,
            'original_url' => Storage::disk('temp')->url('media-library/beispiel.pdf'),
            'name' => 'beispiel',
            'collection_name' => 'defaultSingleFile',
            'size' => 64576,
            'file_name' => 'beispiel.pdf',
            'mime_type' => 'application/pdf',
            'icon' => url('storage/filetypes/applicationpdf.svg'),
        ]);
    Storage::disk('temp')->assertExists('media-library/beispiel.pdf');
});

test('it forces filename when uploading', function () {
    test()->auth()->registerModel()->withoutExceptionHandling();

    test()->postJson('/mediaupload', [
        'parent' => ['model' => 'post', 'collection_name' => 'singleJpegFile', 'id' => null],
        'payload' => ['content' => base64_encode(test()->pngFile()->getContent()), 'name' => 'beispiel.png'],
    ])
        ->assertStatus(201)
        ->assertExactJson([
            'is_deferred' => true,
            'original_url' => Storage::disk('temp')->url('media-library/beispiel.jpg'),
            'name' => 'beispiel',
            'collection_name' => 'singleJpegFile',
            'size' => 490278,
            'file_name' => 'beispiel.jpg',
            'mime_type' => 'image/jpeg',
            'icon' => url('storage/filetypes/imagejpeg.svg'),
        ]);
    Storage::disk('temp')->assertExists('media-library/beispiel.jpg');
    Storage::disk('temp')->assertMissing('media-library/beispiel.png');
});

test('it stores a file to media library after deferred upload', function () {
    Carbon::setTestNow(Carbon::parse('2023-05-06 06:00:00'));
    test()->auth()->registerModel()->withoutExceptionHandling();
    Storage::disk('temp')->put('media-library/beispiel.pdf', test()->pdfFile()->getContent());

    $post = test()->newPost();

    $post->setDeferredUploads([
        'file_name' => 'beispiel.pdf',
        'collection_name' => 'singleForced',
    ]);

    $media = $post->getMedia('singleForced')->first();
    test()->assertNotNull($media);
    test()->assertEquals('beispiel 2023-05-06', $media->name);
    Storage::disk('temp')->assertMissing('media-library/beispiel.pdf');
});

test('it stores multiple files to media library after deferred upload', function () {
    Carbon::setTestNow(Carbon::parse('2023-05-06 06:00:00'));
    test()->auth()->registerModel()->withoutExceptionHandling();
    Storage::disk('temp')->put('media-library/beispiel.pdf', test()->pdfFile()->getContent());
    Storage::disk('temp')->put('media-library/beispiel2.pdf', test()->pdfFile()->getContent());

    $post = test()->newPost();

    $post->setDeferredUploads([
        [
            'file_name' => 'beispiel.pdf',
            'collection_name' => 'multipleForced',
        ],
        [
            'file_name' => 'beispiel2.pdf',
            'collection_name' => 'multipleForced',
        ]
    ]);

    $medias = $post->getMedia('multipleForced');
    test()->assertCount(2, $medias);
    test()->assertEquals('beispiel 2023-05-06', $medias->get(0)->name);
    test()->assertEquals('beispiel2 2023-05-06', $medias->get(1)->name);
    Storage::disk('temp')->assertMissing('media-library/beispiel.pdf');
    Storage::disk('temp')->assertMissing('media-library/beispiel2.pdf');
});

test('it uploads multiple files', function () {
    test()->auth()->registerModel()->withoutExceptionHandling();
    $content = base64_encode(test()->pdfFile()->getContent());

    $payload = [
        'parent' => ['model' => 'post', 'collection_name' => 'multipleForced', 'id' => null],
        'payload' => [
            ['content' => $content, 'name' => 'beispiel.pdf'],
            ['content' => $content, 'name' => 'beispiel2.pdf'],
        ]
    ];

    test()->postJson('/mediaupload', $payload)
        ->assertStatus(201)
        ->assertJson([
            [
                'is_deferred' => true,
                'original_url' => Storage::disk('temp')->url('media-library/beispiel.pdf'),
                'name' => 'beispiel',
                'collection_name' => 'multipleForced',
                'size' => 64576,
                'file_name' => 'beispiel.pdf',
                'mime_type' => 'application/pdf',
            ],
            [
                'is_deferred' => true,
                'original_url' => Storage::disk('temp')->url('media-library/beispiel2.pdf'),
                'name' => 'beispiel2',
                'collection_name' => 'multipleForced',
                'size' => 64576,
                'file_name' => 'beispiel2.pdf',
                'mime_type' => 'application/pdf',
            ]
        ]);
    Storage::disk('temp')->assertExists('media-library/beispiel.pdf');
    Storage::disk('temp')->assertExists('media-library/beispiel2.pdf');
});

test('it reduces file size', function () {
    test()->auth()->registerModel()->withoutExceptionHandling();

    test()->postJson('/mediaupload', [
        'parent' => ['model' => 'post', 'collection_name' => 'defaultSingleFile', 'id' => null],
        'payload' => [
            'content' => base64_encode(test()->jpgFile()->getContent()),
            'name' => 'beispiel bild.jpg',
        ],
    ]);
    $size = getimagesize(Storage::disk('temp')->path('media-library/beispiel bild.jpg'));
    test()->assertEquals(250, $size[0]);
});

test('it handles authorization with collection', function () {
    test()->auth(['storeMedia' => ['collection' => 'rtrt']])->registerModel();
    $content = base64_encode(test()->pdfFile()->getContent());

    test()->postJson('/mediaupload', [
        'parent' => ['model' => 'post', 'collection_name' => 'defaultSingleFile', 'id' => null],
        'payload' => [
            'content' => $content,
            'name' => 'beispiel bild.jpg',
        ],
    ])->assertStatus(403);
});

test('it handles authorization with collection correctly', function () {
    test()->auth(['storeMedia' => ['collection' => 'defaultSingleFile']])->registerModel();
    $content = base64_encode(test()->pdfFile()->getContent());

    test()->postJson('/mediaupload', [
        'parent' => ['model' => 'post', 'collection_name' => 'defaultSingleFile', 'id' => null],
        'payload' => [
            'content' => $content,
            'name' => 'beispiel bild.jpg',
        ],
    ])->assertStatus(201);
});

test('it needs a collection', function ($key, $value) {
    test()->auth()->registerModel();
    $content = base64_encode(test()->pdfFile()->getContent());

    $payload = [
        'parent' => ['model' => 'post', 'collection' => '', 'id' => null],
        'payload' => [
            'content' => $content,
            'name' => 'beispiel bild.jpg',
        ],
    ];

    data_set($payload, $key, $value);

    test()->postJson('/mediaupload', $payload)->assertJsonValidationErrors($key);
})->with(function () {
    yield ['parent.collection_name', ''];
    yield ['parent.collection_name', -1];
    yield ['parent.collection_name', 'missingcollection'];
    yield ['parent.model', 'lalala'];
    yield ['parent.model', -1];
    yield ['parent.model', ''];
});
