<?php

namespace App\Domains\StorageTest\Controllers;

use App\Domains\Attachable\Services\AttachmentService;
use App\Domains\StorageTest\Requests\GenerateS3TemporaryUrlRequest;
use App\Domains\StorageTest\Requests\StoreS3TestFileRequest;
use App\Domains\StorageTest\Services\S3TestService;
use App\Http\Controllers\Controller;
use Illuminate\Http\JsonResponse;

class S3TestController extends Controller
{
    public function __construct(
        protected AttachmentService $attachmentService,
        protected S3TestService $s3TestService,
    ) {
    }

    public function store(StoreS3TestFileRequest $request): JsonResponse
    {
        $attachment = $this->attachmentService->store(
            $request->file('file') ?? (string) $request->validated('file_base64'),
            $request->validated('path'),
        );

        $temporaryUrl = $this->s3TestService->generateTemporaryUrl(
            $attachment->path,
            (int) $request->validated('expires_in_minutes', 10),
        );

        return response()->json(
            [
                'id' => $attachment->id,
                'key' => $attachment->key,
                'path' => $attachment->path,
                'filename' => $attachment->filename,
                'type' => $attachment->type->value,
                'mime_type' => $attachment->mime_type,
                'extension' => $attachment->extension,
                'size' => $attachment->size,
                'temporary_url' => $temporaryUrl['temporary_url'],
                'temporary_url_expires_at' => $temporaryUrl['temporary_url_expires_at'],
            ],
            201,
        );
    }

    public function temporaryUrl(GenerateS3TemporaryUrlRequest $request): JsonResponse
    {
        return response()->json(
            $this->s3TestService->generateTemporaryUrl(
                $request->validated('path'),
                (int) $request->validated('expires_in_minutes', 10),
            )
        );
    }
}
