<?php

namespace App\Services\ScssCdn;

use App\Models\ScssCdn\ScssCdnFile;
use App\Services\System\Settings;
use Illuminate\Support\Facades\URL;
use Carbon\Carbon;

class ScssCdnUrlService
{
    /**
     * Tiempo de expiración por defecto (1 año)
     */
    private const DEFAULT_EXPIRATION_HOURS = 8760; // 365 días * 24 horas

    /**
     * Tiempo de expiración para URLs usadas en la API (1 hora)
     */
    private const API_EXPIRATION_HOURS = 1;

    /**
     * Genera una URL firmada para un archivo SCSS CDN
     *
     * @param ScssCdnFile $file
     * @param int|null $expirationHours Horas hasta la expiración (null = usar default)
     * @return string URL firmada
     */
    public static function generateSecureUrl(ScssCdnFile $file, ?int $expirationHours = null): string
    {
        // **En segundos por dentro**, para que la caducidad de la API pueda ser menor
        // que una hora: la única alternativa que se ha planteado son 30 segundos, y en
        // horas no se puede escribir. La firma sigue aceptando horas para no romper a
        // quien la llame así.
        $segundos = $expirationHours !== null
            ? $expirationHours * 3600
            : app(Settings::class)->diasDeUrlDelPanel() * 86400;

        return self::firmar($file, $segundos);
    }

    /** La firma, con la caducidad ya en segundos. */
    private static function firmar(ScssCdnFile $file, int $segundos): string
    {
        $expiration = Carbon::now()->addSeconds($segundos);

        return URL::temporarySignedRoute(
            'cdn.scss.serve',
            $expiration,
            [
                'token' => $file->secure_token,
                'filename' => $file->filename,
            ]
        );
    }

    /**
     * Obtiene la URL para un archivo específico
     *
     * @param ScssCdnFile $file
     * @return string URL firmada
     */
    public static function getFileUrl(ScssCdnFile $file): string
    {
        return self::generateSecureUrl($file);
    }

    /**
     * Obtiene la URL para un archivo específico con expiración de 1 hora (para uso en API)
     *
     * @param ScssCdnFile $file
     * @return string URL firmada con expiración de 1 hora
     */
    public static function getFileUrlForApi(ScssCdnFile $file): string
    {
        // **La que recibe el plugin.** Configurable en Ajustes del Manager y por
        // defecto 3600 segundos, que es lo que llevaba funcionando.
        return self::firmar($file, app(Settings::class)->segundosDeUrlDeApi());
    }

    /**
     * Genera URLs para múltiples archivos
     *
     * @param \Illuminate\Support\Collection|array $files
     * @param int|null $expirationHours
     * @return array Array con ['file_id' => 'url', ...]
     */
    public static function generateMultipleUrls($files, ?int $expirationHours = null): array
    {
        $urls = [];

        foreach ($files as $file) {
            if ($file instanceof ScssCdnFile) {
                $urls[$file->id] = self::generateSecureUrl($file, $expirationHours);
            }
        }

        return $urls;
    }

    /**
     * Valida si una URL firmada es válida
     *
     * @param string $url
     * @return bool
     */
    public static function isValidSignedUrl(string $url): bool
    {
        try {
            return URL::hasValidSignature(request()->create($url));
        } catch (\Exception $e) {
            return false;
        }
    }
}

