<?php

namespace App\Services;

use App\Support\SiteSettings;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;

/**
 * Guarda logo e favicon.
 *
 * Os arquivos ficam num disco privado e são entregues por um controller.
 * Em cPanel compartilhado o document root é o public_html, separado da pasta
 * public/ do Laravel — o `storage:link` apontaria para o lugar errado, então
 * evitamos o symlink por completo.
 */
class BrandingService
{
    public const DISCO = 'branding';

    /** Chaves de configuração que guardam caminho de arquivo. */
    public const CAMPOS = ['logo_path', 'logo_claro_path', 'favicon_path'];

    public function __construct(private readonly SiteSettings $site) {}

    public function guardar(string $campo, UploadedFile $arquivo): string
    {
        abort_unless(in_array($campo, self::CAMPOS, true), 400);

        $this->remover($campo);

        $nome = sprintf('%s-%s.%s', str_replace('_path', '', $campo), bin2hex(random_bytes(6)), $arquivo->getClientOriginalExtension());

        Storage::disk(self::DISCO)->putFileAs('', $arquivo, $nome);

        $this->site->salvar([$campo => $nome]);

        return $nome;
    }

    public function remover(string $campo): void
    {
        $atual = $this->site->get($campo);

        if ($atual && Storage::disk(self::DISCO)->exists($atual)) {
            Storage::disk(self::DISCO)->delete($atual);
        }

        $this->site->salvar([$campo => null]);
    }

    public function existe(?string $nome): bool
    {
        return filled($nome) && Storage::disk(self::DISCO)->exists($nome);
    }
}
