using System.Text.Json.Serialization;
using TakeoutSaaS.Domain.Dictionary.Enums;
using TakeoutSaaS.Shared.Abstractions.Serialization;

namespace TakeoutSaaS.Application.Dictionary.Models;

/// <summary>
/// 字典标签覆盖 DTO。
/// </summary>
public sealed class LabelOverrideDto
{
    /// <summary>
    /// 覆盖记录 ID。
    /// </summary>
    [JsonConverter(typeof(SnowflakeIdJsonConverter))]
    public long Id { get; init; }

    /// <summary>
    /// 租户 ID。
    /// </summary>
    [JsonConverter(typeof(SnowflakeIdJsonConverter))]
    public long TenantId { get; init; }

    /// <summary>
    /// 被覆盖的字典项 ID。
    /// </summary>
    [JsonConverter(typeof(SnowflakeIdJsonConverter))]
    public long DictionaryItemId { get; init; }

    /// <summary>
    /// 字典项 Key。
    /// </summary>
    public string DictionaryItemKey { get; init; } = string.Empty;

    /// <summary>
    /// 原始显示值（多语言）。
    /// </summary>
    public Dictionary<string, string> OriginalValue { get; init; } = new(StringComparer.OrdinalIgnoreCase);

    /// <summary>
    /// 覆盖后的显示值（多语言）。
    /// </summary>
    public Dictionary<string, string> OverrideValue { get; init; } = new(StringComparer.OrdinalIgnoreCase);

    /// <summary>
    /// 覆盖类型。
    /// </summary>
    public OverrideType OverrideType { get; init; }

    /// <summary>
    /// 覆盖类型名称。
    /// </summary>
    public string OverrideTypeName => OverrideType switch
    {
        OverrideType.TenantCustomization => "租户定制",
        _ => "未知"
    };

    /// <summary>
    /// 覆盖原因/备注。
    /// </summary>
    public string? Reason { get; init; }

    /// <summary>
    /// 创建时间。
    /// </summary>
    public DateTime CreatedAt { get; init; }

    /// <summary>
    /// 更新时间。
    /// </summary>
    public DateTime? UpdatedAt { get; init; }

    /// <summary>
    /// 创建人 ID。
    /// </summary>
    [JsonConverter(typeof(SnowflakeIdJsonConverter))]
    public long? CreatedBy { get; init; }

    /// <summary>
    /// 更新人 ID。
    /// </summary>
    [JsonConverter(typeof(SnowflakeIdJsonConverter))]
    public long? UpdatedBy { get; init; }
}

/// <summary>
/// 创建/更新标签覆盖请求。
/// </summary>
public sealed class UpsertLabelOverrideRequest
{
    /// <summary>
    /// 被覆盖的字典项 ID。
    /// </summary>
    [JsonConverter(typeof(SnowflakeIdJsonConverter))]
    public long DictionaryItemId { get; init; }

    /// <summary>
    /// 覆盖后的显示值（多语言）。
    /// </summary>
    public Dictionary<string, string> OverrideValue { get; init; } = new(StringComparer.OrdinalIgnoreCase);

    /// <summary>
    /// 覆盖原因/备注。
    /// </summary>
    public string? Reason { get; init; }
}

/// <summary>
/// 批量覆盖请求。
/// </summary>
public sealed class BatchLabelOverrideRequest
{
    /// <summary>
    /// 覆盖项列表。
    /// </summary>
    public List<UpsertLabelOverrideRequest> Items { get; init; } = new();
}
