using System.Collections.ObjectModel;

namespace TakeoutSaaS.Module.Tenancy;

/// <summary>
/// 多租户解析配置项。
/// </summary>
public sealed class TenantResolutionOptions
{
    /// <summary>
    /// 通过 Header 解析租户 ID 时使用的头名称，默认 X-Tenant-Id。
    /// </summary>
    public string TenantIdHeaderName { get; set; } = "X-Tenant-Id";

    /// <summary>
    /// 通过 Header 解析租户编码时使用的头名称，默认 X-Tenant-Code。
    /// </summary>
    public string TenantCodeHeaderName { get; set; } = "X-Tenant-Code";

    /// <summary>
    /// 明确指定 host 与租户 ID 对应关系的映射表（精确匹配）。
    /// </summary>
    public IDictionary<string, long> DomainTenantMap { get; set; }
        = new Dictionary<string, long>(StringComparer.OrdinalIgnoreCase);

    /// <summary>
    /// 租户编码到租户 ID 的映射表，用于 header 或子域名解析。
    /// </summary>
    public IDictionary<string, long> CodeTenantMap { get; set; }
        = new Dictionary<string, long>(StringComparer.OrdinalIgnoreCase);

    /// <summary>
    /// 根域（不含子域），用于形如 {tenant}.rootDomain 的场景，例如 admin.takeoutsaas.com。
    /// </summary>
    public string? RootDomain { get; set; }

    /// <summary>
    /// 需要跳过租户解析的路径集合（如健康检查），默认仅包含 /health。
    /// </summary>
    public ISet<string> IgnoredPaths { get; } = new HashSet<string>(StringComparer.OrdinalIgnoreCase) { "/health" };

    /// <summary>
    /// 若为 true，当无法解析租户时立即返回 400；否则交由上层自行判定。
    /// </summary>
    public bool ThrowIfUnresolved { get; set; }

    /// <summary>
    /// 对外只读视图，便于审计日志输出。
    /// </summary>
    public IReadOnlyDictionary<string, long> DomainMappings => new ReadOnlyDictionary<string, long>(DomainTenantMap);

    /// <summary>
    /// 对外只读的编码映射。
    /// </summary>
    public IReadOnlyDictionary<string, long> CodeMappings => new ReadOnlyDictionary<string, long>(CodeTenantMap);
}
