<?php

use App\Models\Client;
use App\Models\Declaration;
use App\Models\MediaDownload;
use App\Models\User;
use App\Models\Workspace;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;

function setupDeclarationWithMedia(): array
{
    $user = User::factory()->create();
    $workspace = Workspace::factory()->create();
    $workspace->users()->attach($user, ['role' => 'owner']);
    $client = Client::factory()->create(['workspace_id' => $workspace->id]);
    $declaration = Declaration::factory()->create([
        'workspace_id' => $workspace->id,
        'client_id' => $client->id,
    ]);

    Storage::fake('public');
    $file = UploadedFile::fake()->create('document.pdf', 100, 'application/pdf');
    $media = $declaration->addMedia($file)->toMediaCollection('documents');

    return [$user, $workspace, $declaration, $media];
}

test('downloading creates a media download record', function () {
    [$user, $workspace, $declaration, $media] = setupDeclarationWithMedia();
    session(['current_workspace_id' => $workspace->id]);

    $this->actingAs($user)->get(route('declarations.media.download', [
        'declaration' => $declaration,
        'mediaId' => $media->id,
    ]));

    $download = MediaDownload::query()
        ->where('media_id', $media->id)
        ->where('user_id', $user->id)
        ->first();

    expect($download)->not->toBeNull();
    expect($download->downloaded_at)->not->toBeNull();
});

test('re-downloading updates timestamp without creating duplicates', function () {
    [$user, $workspace, $declaration, $media] = setupDeclarationWithMedia();
    session(['current_workspace_id' => $workspace->id]);

    $this->actingAs($user)->get(route('declarations.media.download', [
        'declaration' => $declaration,
        'mediaId' => $media->id,
    ]));

    $firstDownload = MediaDownload::query()
        ->where('media_id', $media->id)
        ->where('user_id', $user->id)
        ->first();
    $firstTimestamp = $firstDownload->downloaded_at;

    $this->travel(5)->minutes();

    $this->actingAs($user)->get(route('declarations.media.download', [
        'declaration' => $declaration,
        'mediaId' => $media->id,
    ]));

    $count = MediaDownload::query()
        ->where('media_id', $media->id)
        ->where('user_id', $user->id)
        ->count();

    expect($count)->toBe(1);

    $firstDownload->refresh();
    expect($firstDownload->downloaded_at->gt($firstTimestamp))->toBeTrue();
});

test('download status is per-user in show endpoint', function () {
    [$user, $workspace, $declaration, $media] = setupDeclarationWithMedia();
    $otherUser = User::factory()->create();
    $workspace->users()->attach($otherUser, ['role' => 'manager']);
    session(['current_workspace_id' => $workspace->id]);

    MediaDownload::query()->create([
        'media_id' => $media->id,
        'user_id' => $user->id,
        'downloaded_at' => now(),
    ]);

    $response = $this->actingAs($user)->get(route('declarations.show', $declaration));
    $response->assertOk();
    $documents = $response->original->getData()['page']['props']['documents'];
    $doc = collect($documents)->firstWhere('id', $media->id);
    expect($doc['is_downloaded'])->toBeTrue();

    $response2 = $this->actingAs($otherUser)->get(route('declarations.show', $declaration));
    $response2->assertOk();
    $documents2 = $response2->original->getData()['page']['props']['documents'];
    $doc2 = collect($documents2)->firstWhere('id', $media->id);
    expect($doc2['is_downloaded'])->toBeFalse();
});
