// oms/src/services/userService.ts
import { User, IUser } from "../models/userModel"; // 导入 User 模型及其接口
import { FilterQuery } from "mongoose"; // 👈 导入 FilterQuery 类型

class UserService {
  /**
   * 创建一个新用户。
   * @param userData - 新用户的数据。
   * @returns 创建的用户文档。
   */
  public async createUser(userData: Partial<IUser>): Promise<IUser> {
    try {
      const newUser = new User(userData);
      await newUser.save();
      return newUser;
    } catch (error) {
      console.error("创建用户时出错:", error);
      throw new Error("无法创建用户。");
    }
  }

  /**
   * 通过 uid 获取用户。
   * @param uid - 用户的唯一标识符。
   * @returns 用户文档，如果未找到则为 null。
   */
  public async getUserByUid(uid: string): Promise<IUser | null> {
    try {
      // 直接从 MongoDB 中获取
      const user = await User.findOne({ uid: uid });
      return user;
    } catch (error) {
      console.error(`通过 UID ${uid} 获取用户时出错:`, error);
      throw new Error("无法检索用户。");
    }
  }

  /**
   * 更新现有用户。
   * @param uid - 要更新用户的唯一标识符。
   * @param updateData - 要更新的数据。
   * @returns 更新后的用户文档，如果未找到则为 null。
   */
  public async updateUser(uid: string, updateData: Partial<IUser>): Promise<IUser | null> {
    try {
      // 避免直接更新 uid
      if (updateData.uid) {
        delete updateData.uid;
      }

      const updatedUser = await User.findOneAndUpdate(
        { uid: uid },
        updateData,
        { new: true } // 返回更新后的文档
      );
      return updatedUser;
    } catch (error) {
      console.error(`更新用户 ${uid} 时出错:`, error);
      throw new Error("无法更新用户。");
    }
  }

  /**
   * 通过 uid 删除用户。
   * @param uid - 要删除用户的唯一标识符。
   * @returns 如果删除成功则为 true，如果未找到则为 false。
   */
  public async deleteUser(uid: string): Promise<boolean> {
    try {
      const result = await User.deleteOne({ uid: uid });
      return result.deletedCount > 0;
    } catch (error) {
      console.error(`删除用户 ${uid} 时出错:`, error);
      throw new Error("无法删除用户。");
    }
  }

  /**
   * 按照分页和查询参数获取用户列表。
   * @param page - 当前页码（从1开始）。
   * @param limit - 每页的用户数量。
   * @param query - 用于过滤用户的查询条件 (例如 { project: 1, cc: 'US' })。
   * @returns 包含用户列表和总数的对象。
   */
  public async getPaginatedUsers(page: number, limit: number, query: Partial<IUser>): Promise<{ users: IUser[]; total: number }> {
    try {
      const skip = (page - 1) * limit;

      // 异步执行查询和计数
      const [users, total] = await Promise.all([
        // 👈 关键修改：将 query 断言为 FilterQuery<IUser>
        User.find(query as FilterQuery<IUser>)
          .sort({ createdAt: -1 })
          .skip(skip)
          .limit(limit)
          .exec(),
        User.countDocuments(query as FilterQuery<IUser>).exec(),
      ]);

      return { users, total };
    } catch (error) {
      console.error("获取分页用户列表时出错:", error);
      throw new Error("无法检索用户列表。");
    }
  }
}

export default new UserService();
