<?php

namespace App\Services\ScssCdn;

use App\Models\ScssCdn\ScssCdnFile;
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
    {
        $expirationHours = $expirationHours ?? self::DEFAULT_EXPIRATION_HOURS;
        $expiration = Carbon::now()->addHours($expirationHours);

        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
    {
        return self::generateSecureUrl($file, self::API_EXPIRATION_HOURS);
    }

    /**
     * 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;
        }
    }
}

