using System.ComponentModel.DataAnnotations;

namespace TakeoutSaaS.Module.Storage.Options;

/// <summary>
/// 文件安全与防盗链相关配置。
/// </summary>
public sealed class StorageSecurityOptions
{
    /// <summary>
    /// 单个文件最大尺寸（字节），默认 10MB。
    /// </summary>
    [Range(1, long.MaxValue)]
    public long MaxFileSizeBytes { get; set; } = 10 * 1024 * 1024;

    /// <summary>
    /// 允许的图片后缀名白名单。
    /// </summary>
    [MinLength(1)]
    public string[] AllowedImageExtensions { get; set; } = { ".jpg", ".jpeg", ".png", ".webp", ".gif" };

    /// <summary>
    /// 允许的通用文件后缀名白名单。
    /// </summary>
    [MinLength(1)]
    public string[] AllowedFileExtensions { get; set; } = { ".jpg", ".jpeg", ".png", ".webp", ".gif", ".pdf" };

    /// <summary>
    /// 默认签名有效期（分钟），用于生成带过期时间的访问链接。
    /// </summary>
    [Range(1, 24 * 60)]
    public int DefaultUrlExpirationMinutes { get; set; } = 30;

    /// <summary>
    /// 是否启用来源校验（防盗链），为空则不校验。
    /// </summary>
    public bool EnableRefererValidation { get; set; } = true;

    /// <summary>
    /// 允许的 Referer/Origin 前缀列表，用于限制上传接口调用来源。
    /// </summary>
    public string[] AllowedReferers { get; set; } = Array.Empty<string>();

    /// <summary>
    /// 针对 CDN 防盗链的额外签名密钥（可选），用于生成二次校验签名。
    /// </summary>
    public string? AntiLeechTokenSecret { get; set; }
}
