<?php

namespace Tests\Feature\MediaFolder;

use App\Models\Backoffice\Auth\BackendUser;
use App\Models\Backoffice\MediaFolder;
use App\Models\Backoffice\MediaItem;
use Tests\TestCase;
use Illuminate\Support\Facades\Storage;

class RenameFolderTest extends TestCase
{
    public function testItRenamesFolder()
    {
        Storage::fake('media');
        Storage::disk('media')->makeDirectory('test');

        $folder = MediaFolder::create([
            'base_folder' => 'media',
            'path' => 'test',
            'name' => 'test',
            'parent_id' => null,
        ]);

        $response = $this->actingAsAdmin()->postJson("/admin/media/folders/{$folder->id}/rename", [
            'name' => 'renamed',
            'base_folder' => 'default',
        ]);

        $response->assertStatus(200)
            ->assertJsonStructure(['id', 'baseFolder', 'path', 'name'])
            ->assertJson([
                'baseFolder' => 'media',
                'path' => 'renamed',
                'name' => 'renamed',
            ]);

        $this->assertDatabaseHas('media_folders', [
            'id' => $folder->id,
            'base_folder' => 'media',
            'path' => 'renamed',
            'name' => 'renamed',
        ]);

        Storage::disk('media')->assertExists('renamed');
        Storage::disk('media')->assertMissing('test');
    }

    public function testItRenamesFolderWithDescendants()
    {
        Storage::fake('media');
        Storage::disk('media')->makeDirectory('parent/child');
        Storage::disk('media')->put('parent/child/file.jpg', 'foobar');

        $user = BackendUser::first();

        $parent = MediaFolder::create([
            'base_folder' => 'media',
            'path' => 'parent',
            'name' => 'parent',
            'parent_id' => null,
        ]);

        $child = MediaFolder::create([
            'base_folder' => 'media',
            'path' => 'parent/child',
            'name' => 'child',
            'parent_id' => $parent->id,
        ]);

        $mediaItem = MediaItem::create([
            'base_folder' => 'media',
            'path' => 'parent/child/file.jpg',
            'filename' => 'file.jpg',
            'original_filename' => 'file.jpg',
            'title' => 'file.jpg',
            'extension' => 'jpg',
            'related_type' => null,
            'media_type' => MediaItem::MEDIA_TYPE_IMAGE,
            'backend_user_id' => $user->id,
            'size' => Storage::disk('media')->size('parent/child/file.jpg'),
            'width' => 800,
            'height' => 600,
            'media_folder_id' => $child->id,
        ]);

        $response = $this->actingAsAdmin()->postJson("/admin/media/folders/{$parent->id}/rename", [
            'name' => 'renamed',
            'base_folder' => 'default',
        ]);

        $response->assertStatus(200)
            ->assertJsonStructure(['id', 'baseFolder', 'path', 'name'])
            ->assertJson([
                'baseFolder' => 'media',
                'path' => 'renamed',
                'name' => 'renamed',
            ]);

        $this->assertDatabaseHas('media_folders', [
            'id' => $parent->id,
            'base_folder' => 'media',
            'path' => 'renamed',
            'name' => 'renamed',
        ]);

        $this->assertDatabaseHas('media_folders', [
            'id' => $child->id,
            'base_folder' => 'media',
            'path' => 'renamed/child',
            'name' => 'child',
            'parent_id' => $parent->id,
        ]);

        $this->assertDatabaseHas('media_items', [
            'id' => $mediaItem->id,
            'base_folder' => 'media',
            'path' => 'renamed/child/file.jpg',
            'filename' => 'file.jpg',
            'media_folder_id' => $child->id,
        ]);

        Storage::disk('media')->assertExists('renamed/child');
        Storage::disk('media')->assertExists('renamed/child/file.jpg');
        Storage::disk('media')->assertMissing('parent');
    }
}
