using OpenSearch.Client;
namespace Store.Modules.CloudProduct.Dtos
{
///
/// 用户收藏商品搜索文档:OpenSearch 索引中的收藏模型。
/// 一条收藏记录 = 用户 + 商品快照(标题/价格/销量/类目)+ 收藏分组,
/// 文档 Id 固定为 "{user_name}:{goods_id}"(表 uk_user_goods 保证唯一),便于收藏/取消收藏时幂等覆盖与删除。
///
public class UserFavoritesSearchDocument
{
///
/// 文档主键(同时作为 OpenSearch 的 _id):{user_name}:{goods_id}
///
[Keyword(Name = "id")]
public string Id { get; set; } = string.Empty;
///
/// 收藏记录自增主键(user_goods_favorites.id)
///
[Number(NumberType.Long, Name = "fav_id")]
public long FavId { get; set; }
/// 用户名(收藏归属人,检索时强制过滤)
[Keyword(Name = "user_name")]
public string UserName { get; set; } = string.Empty;
/// 收藏分组ID(0 表示默认分组)
[Number(NumberType.Integer, Name = "group_id")]
public int GroupId { get; set; }
/// 收藏分组名(分组ID为0时为默认分组名)
[Keyword(Name = "group_name")]
public string GroupName { get; set; } = string.Empty;
/// 商品编号
[Number(NumberType.Long, Name = "goods_id")]
public long GoodsId { get; set; }
/// 平台类型(1 PDD、2 WX)
[Number(NumberType.Byte, Name = "platform")]
public byte Platform { get; set; }
/// 商品标题,用于分词搜索
[Text(Name = "title", Analyzer = "ik_max_word", SearchAnalyzer = "ik_smart")]
public string Title { get; set; } = string.Empty;
/// 缩略图
[Text(Name = "thumb_url")]
public string? ThumbUrl { get; set; }
/// 一级类目ID
[Number(NumberType.Integer, Name = "cat_id_1")]
public int? CatId1 { get; set; }
/// 二级类目ID
[Number(NumberType.Integer, Name = "cat_id_2")]
public int? CatId2 { get; set; }
/// 三级类目ID
[Number(NumberType.Integer, Name = "cat_id_3")]
public int? CatId3 { get; set; }
/// 四级类目ID
[Number(NumberType.Integer, Name = "cat_id_4")]
public int? CatId4 { get; set; }
/// 最低价快照(分),用于价格区间过滤和按价格排序
[Number(NumberType.Long, Name = "min_price")]
public long? MinPrice { get; set; }
/// 销量,用于按销量排序
[Number(NumberType.Integer, Name = "sold_quantity")]
public int SoldQuantity { get; set; }
/// 收藏时间,默认按此字段倒序
[Date(Name = "created_at")]
public DateTime CreatedAt { get; set; }
///
/// 生成文档主键:{user_name}:{goods_id}
///
public static string BuildId(string userName, long goodsId) => $"{userName}:{goodsId}";
public override string ToString() => $"[Id={Id}] User={UserName} Goods={GoodsId} Group={GroupId}({GroupName}) Title={Title} Price={MinPrice} Sold={SoldQuantity}";
}
}