<?php

namespace App\Services\Expenses;

use App\Services\ApplicationUrlService;
use Illuminate\Http\UploadedFile;

class ExpenseReceiptService
{
    public function __construct(
        private ApplicationUrlService $urls
    ) {
    }

    public function storeReceipt(UploadedFile $file): string
    {
        if (! $file->isValid()) {
            throw new \InvalidArgumentException('Invalid receipt upload.');
        }

        $allowed = [
            'image/jpeg' => 'jpg',
            'image/png' => 'png',
            'image/webp' => 'webp',
            'application/pdf' => 'pdf',
        ];

        $mime = strtolower((string) $file->getMimeType());
        if (! isset($allowed[$mime])) {
            throw new \InvalidArgumentException('Unsupported receipt file type.');
        }

        if ((int) $file->getSize() > 5 * 1024 * 1024) {
            throw new \InvalidArgumentException('Receipt file too large. Max 5MB.');
        }

        $filename = bin2hex(random_bytes(16)) . '.' . $allowed[$mime];
        $file->storeAs('receipts', $filename);

        return $filename;
    }

    public function receiptUrl(?string $filename): ?string
    {
        return $this->urls->forReceiptStorage($filename);
    }
}
