// oms/src/models/userModel.ts
import mongoose, { Document, Schema } from "mongoose";

// 定义 User 文档的 TypeScript 接口
// 注意：createdAt 和 updatedAt 将由 Mongoose 自动添加，所以我们在这里不显式定义它们
export interface IUser extends Document {
  uid: string; // 唯一索引
  project: number; // 项目id
  network?: string; // 来源渠道
  campaign?: string; // 设备当前归因推广活动的名称
  adgroup?: string; // 设备当前归因广告组的名称
  creative?: string; // 设备当前归因素材的名称
  prod?: string; // 归属产品 (填色产品，jigsaw产品等)
  libraryName?: string; // 其实就是操作系统，取值android/ios
  cc?: string; // 国家代码
  lang?: string; // 语言
  manufacturer?: string; // 生产厂商
  deviceModel?: string; // 设备型号 (已从 model 更改为 deviceModel)
  deviceInfo?: string; // 设备信息 (已从 device 更改为 deviceInfo)
  hardware?: string; // 硬件信息
  deviceMem?: number; // 机身内存
  apiLevel?: number; // api版本号
  versionName?: string; // 软件版本
  versionCode?: number; // 软件编号
  fmToken?: string | null; // <--- 关键修改：明确允许 null 类型，以兼容数据库清除操作
  tags?: string[]; // 用户画像（基础维度、内容偏好维度、社区属性维度等），现在是字符串数组
  firstLoginAt?: Date; // 首次登录时间
  lastActiveAt?: Date; // 上次活跃时间
  // createdAt 和 updatedAt 将由 timestamps: true 自动添加并包含在 Document 接口中
}

// 定义 User Schema
const UserSchema: Schema = new Schema(
  {
    uid: { type: String, required: true, unique: true }, // uid 字段，唯一且必需, 对于project_id=1, 对应原始日志的uid字段，对于project_id=6, 对应原始日志的user_id
    project: { type: Number, index: true }, // 来自原始日志的project_id字段，多个事件都有上报，属于公共属性， 填色android应用project_id=1, ios版本project_id=6
    network: { type: String, index: true }, // 来自原始visit事件日志的 network 字段， 可能为null
    campaign: { type: String, index: true }, // 来自原始visit事件日志的 campaign 字段， 可能为null
    adgroup: { type: String, index: true }, // 来自原始visit事件日志的 adgroup 字段， 可能为null
    creative: { type: String, index: true }, // 来自原始visit事件日志的 creative 字段， 可能为null
    prod: { type: String, index: true }, // 来自原始日志的prod字段，多个事件都有上报， "number"表示填色应用， "jigsaw"表示拼图游戏等
    libraryName: { type: String, enum: ["ios", "android"], index: true }, // 来自原始日志的library_name字段
    cc: { type: String, index: true }, // 来自原始日志的cc字段，表示国家代码
    lang: { type: String, index: true }, // 来自原始日志的lang字段，表示语言，目前没有上报，全是null，以后app更新会加上
    manufacturer: { type: String }, // 来自原始日志的manufacturer字段，生产厂商
    deviceModel: { type: String, index: true }, // 来自原始日志的model字段，表示设备型号
    deviceInfo: { type: String }, // 来自原始日志的device字段，表示设备机型代号
    hardware: { type: String }, // 来自原始日志的hardware字段，硬件的型号吧
    deviceMem: { type: Number }, // 来自原始日志的deviceMem字段，表示机身内存，单位MB
    apiLevel: { type: Number, index: true }, // 来自原始日志的android_api字段，表示andriod api级别，只对android版本有用
    versionName: { type: String, index: true }, // 来自原始日志的version_name字段， 如果是ios填色应用(project_id=6)则对应的是library_version字段
    versionCode: { type: Number, index: true }, // 来自原始日志的version_code 字段
    fmToken: { type: String }, // 来自原始firebase_message_token日志的token字段，解析到firebase_message_token日志后更新
    tags: { type: [String], index: true }, // <--- 关键修改：现在是字符串数组类型
    firstLoginAt: { type: Date, index: true }, // 来自原始日志，表示首次登陆事件，考虑到前面的日志的丢失，可以通过visit事件日志的days天数字段来倒推
    lastActiveAt: { type: Date, index: true }, // 来自原始日志的t字段或者create_at字段，表示上次活跃时间，结合days（如果有的话）可以倒推firstLoginAt
  },
  {
    timestamps: true, // 启用时间戳，自动维护 createdAt 和 updatedAt
  }
);

// 创建并导出 User Model
export const User = mongoose.model<IUser>("User", UserSchema);
