using System.Text.RegularExpressions;
using TeleWave.Infrastructure.Media;

namespace TeleWave.Api.Common;

/// <summary>
/// Общая проверка файлов нарезки для всех эндпоинтов, отдающих HLS: эфир, превью заставок.
/// Имя сегмента сверяется с allowlist, а путь резолвится через <see cref="MediaPathResolver"/>,
/// который бросает <see cref="UnauthorizedAccessException"/> на попытку выйти за пределы каталога —
/// наружу это должно выглядеть как обычный 404, а не как ошибка сервера.
/// </summary>
internal static partial class SegmentFiles
{
    [GeneratedRegex(@"^seg\d{1,6}\.ts$")]
    private static partial Regex SegmentName();

    public static bool IsSegmentName(string file) => SegmentName().IsMatch(file);

    /// <summary>Путь к существующему файлу нарезки, либо null — если имя опасно или файла нет.</summary>
    public static string? TryResolveExisting(MediaPathResolver paths, Guid assetId, string fileName)
    {
        string path;
        try
        {
            path = paths.SegmentPath(assetId, fileName);
        }
        catch (UnauthorizedAccessException)
        {
            return null;
        }

        return File.Exists(path) ? path : null;
    }
}
