syntax = "proto3";

package hyapp.events.luckygift.v1;

option go_package = "hyapp.local/api/proto/events/luckygift/v1;luckygifteventsv1";

// EventEnvelope 是 lucky-gift-service 发布 owner outbox 事实的稳定信封。
// occurred_at_ms 固定为抽奖事实创建时的 Unix epoch milliseconds；MQ 实际发送时间不改变业务发生时间。
message EventEnvelope {
  string event_id = 1;
  string event_type = 2;
  string app_code = 3;
  // draw_id 是本次送礼命令的聚合中奖标识；批量子抽明细仍只保存在 lucky owner 数据库，不能放大 MQ 负载。
  string draw_id = 4;
  int64 occurred_at_ms = 5;
  bytes body = 6;
}

// LuckyGiftDrawn 表达钱包返奖已经 granted 的幸运礼物中奖事实。
// lucky-gift-service 必须先完成 wallet-service 入账和本地 granted 收敛，再发布本事件；
// room-service 与 activity-service 只从该事实派生房内 IM 和区域飘屏，不能反向改变抽奖或账务状态。
message LuckyGiftDrawn {
  string draw_id = 1;
  string command_id = 2;
  string room_id = 3;
  string pool_id = 4;
  string gift_id = 5;
  int32 gift_count = 6;
  int64 sender_user_id = 7;
  int64 target_user_id = 8;
  // 展示资料是送礼入口固化的快照；消费者不应为了飘屏高频同步反查 user-service。
  string sender_name = 9;
  string sender_avatar = 10;
  string sender_display_user_id = 11;
  string sender_pretty_display_user_id = 12;
  // visible_region_id 是房间可见区域，区域播报不能用客户端 IP 或服务所在地推断。
  int64 visible_region_id = 13;
  int64 country_id = 14;
  int64 coin_spent = 15;
  int64 rule_version = 16;
  string experience_pool = 17;
  string selected_tier_id = 18;
  int64 multiplier_ppm = 19;
  int64 base_reward_coins = 20;
  int64 effective_reward_coins = 21;
  bool stage_feedback = 22;
  bool high_multiplier = 23;
  // reward_status 在本事件中只能是 granted；保留字段是为了下游 JSON 与现有 Flutter 协议同名映射。
  string reward_status = 24;
  string wallet_transaction_id = 25;
  // 两个时间均为 UTC Unix epoch milliseconds：抽奖发生时间与钱包返奖确认时间不能混用。
  int64 draw_created_at_ms = 26;
  int64 reward_granted_at_ms = 27;
  // room_locked 是 room-service 在原始送礼命令内固化的 Room Cell 锁状态；下游不能异步回查当前房间再改写历史事实。
  bool room_locked = 28;
  // owner_user_id 是原始送礼命令内固化的房主快照，只用于跨房展示交互，不参与抽奖或返奖。
  int64 owner_user_id = 29;
}
