<?php

namespace Tests\Unit;

use Tests\TestCase;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Storage;
use Illuminate\Http\UploadedFile;

use App\Models\FileUpload;
use App\Models\EmbedVideo;

class EmbedVideoTest extends TestCase
{
    public function test_an_embed_video_has_a_url_attribute()
    {
        $file_upload = new FileUpload();
        $file_upload->storage_filename = 'test/test.mp4';
        $file_upload->name = 'test.mp4';
        $file_upload->filename = 'test';
        $file_upload->extension = 'mp4';
        $file_upload->mime = 'video/mp4';
        $file_upload->size = 912681;
        $file_upload->save();
        $file_upload->refresh();

        $embed_video = EmbedVideo::factory()->create([
            'file_upload_id' => $file_upload->id,
        ]);

        $this->assertNotNull($embed_video->fileUpload);
        $this->assertNotNull($embed_video->url);
        $this->assertTrue(Str::contains($embed_video->url, $embed_video->fileUpload->name));
        $this->assertNotNull($file_upload->videos->contains('id', $embed_video->id));
    }

    public function test_an_embed_video_has_a_small_medium_large_retina_url()
    {
        $file_upload = new FileUpload();
        $file_upload->storage_filename = 'test/test.mp4';
        $file_upload->name = 'test.mp4';
        $file_upload->filename = 'test';
        $file_upload->extension = 'mp4';
        $file_upload->mime = 'video/mp4';
        $file_upload->size = 912681;
        $file_upload->save();
        $file_upload->refresh();

        $embed_video = EmbedVideo::factory()->create([
            'file_upload_id' => $file_upload->id,
        ]);

        $this->assertNotNull($embed_video->url);
        $this->assertTrue(Str::contains($embed_video->url, $embed_video->fileUpload->name));
        Storage::disk('public')->assertExists($embed_video->url);

        $embed_video->createSizes('small');
        $embed_video->createSizes('medium');
        $embed_video->createSizes('large');
        $embed_video->createSizes('retina');
        $embed_video->createSizes('hls');
        $this->assertNotNull($embed_video->url_retina);
        Storage::disk('public')->assertExists($embed_video->url_retina);
        $this->assertNotNull($embed_video->url_large);
        Storage::disk('public')->assertExists($embed_video->url_large);
        $this->assertNotNull($embed_video->url_medium);
        Storage::disk('public')->assertExists($embed_video->url_medium);
        $this->assertNotNull($embed_video->url_small);
        Storage::disk('public')->assertExists($embed_video->url_small);
        $this->assertNotNull($embed_video->url_hls);
        Storage::disk('public')->assertExists($embed_video->url_hls);
    }

    public function test_an_embed_video_can_regenerate_its_files(): void
    {
        $file_upload = new FileUpload();
        $file_upload->storage_filename = 'test/test.mp4';
        $file_upload->name = 'test.mp4';
        $file_upload->filename = 'test';
        $file_upload->extension = 'mp4';
        $file_upload->mime = 'video/mp4';
        $file_upload->size = 912681;
        $file_upload->save();
        $file_upload->refresh();

        $embed_video = EmbedVideo::factory()->create([
            'file_upload_id' => $file_upload->id,
        ]);

        $this->assertNotNull($embed_video->url);
        $this->assertTrue(Str::contains($embed_video->url, $embed_video->fileUpload->name));
        Storage::disk('public')->assertExists($embed_video->url);

        $embed_video->regenerate();
        sleep(10);

        $this->assertNotNull($embed_video->url_retina);
        Storage::disk('public')->assertExists($embed_video->url_retina);
        $this->assertNotNull($embed_video->url_large);
        Storage::disk('public')->assertExists($embed_video->url_large);
        $this->assertNotNull($embed_video->url_medium);
        Storage::disk('public')->assertExists($embed_video->url_medium);
        $this->assertNotNull($embed_video->url_small);
        Storage::disk('public')->assertExists($embed_video->url_small);
        $this->assertNotNull($embed_video->url_hls);
        Storage::disk('public')->assertExists($embed_video->url_hls);

        $remove_files = true;
        $embed_video->regenerate($remove_files);
        sleep(10);

        $this->assertNotNull($embed_video->url_retina);
        Storage::disk('public')->assertExists($embed_video->url_retina);
        $this->assertNotNull($embed_video->url_large);
        Storage::disk('public')->assertExists($embed_video->url_large);
        $this->assertNotNull($embed_video->url_medium);
        Storage::disk('public')->assertExists($embed_video->url_medium);
        $this->assertNotNull($embed_video->url_small);
        Storage::disk('public')->assertExists($embed_video->url_small);
        $this->assertNotNull($embed_video->url_hls);
        Storage::disk('public')->assertExists($embed_video->url_hls);
    }
}
