<?php

namespace App\Http\Controllers;

use App\Services\BrandingService;
use App\Support\SiteSettings;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Symfony\Component\HttpFoundation\Response;

/**
 * Entrega logo e favicon a partir do disco privado.
 *
 * Rota pública — são imagens de marca, aparecem na tela de login. O cache
 * longo com validação por ETag evita bater no disco a cada carregamento.
 */
class BrandingController extends Controller
{
    public function __invoke(Request $request, string $tipo, SiteSettings $site, BrandingService $branding): Response
    {
        $campo = match ($tipo) {
            'logo' => 'logo_path',
            'logo-claro' => 'logo_claro_path',
            'favicon' => 'favicon_path',
            default => abort(404),
        };

        $nome = $site->get($campo);

        abort_unless($branding->existe($nome), 404);

        $disco = Storage::disk(BrandingService::DISCO);
        $conteudo = $disco->get($nome);
        $etag = '"'.md5($nome.$disco->lastModified($nome)).'"';

        if ($request->headers->get('If-None-Match') === $etag) {
            return response('', 304);
        }

        return response($conteudo, 200, [
            'Content-Type' => $disco->mimeType($nome) ?: 'application/octet-stream',
            'Cache-Control' => 'public, max-age=86400',
            'ETag' => $etag,
        ]);
    }
}
