// oms/src/services/artService.ts
import { FilterQuery, SortOrder } from "mongoose";
import Art, { IArt, PageStatus, SpecialThumbType } from "../models/artModel"; // 导入 Art 模型和 IArt 接口，以及枚举

class ArtService {
  /**
   * 按 ID 更新作品信息。
   * 特别适用于更新统计字段，并确保核心字段不被误改。
   * @param artId 作品的 MongoDB _id。
   * @param updateData 包含要更新字段的对象。
   * @returns 更新后的作品文档，如果未找到则为 null。
   */
  public async updateArt(artId: string, updateData: Partial<IArt>): Promise<IArt | null> {
    try {
      // 过滤掉不应通过此方法更新的核心字段，例如：
      // _id, pageId, user, work 等通常在创建后不应改变
      const mutableUpdateData: Partial<IArt> = { ...updateData };
      delete mutableUpdateData._id;
      delete mutableUpdateData.pageId;
      delete mutableUpdateData.user;
      delete mutableUpdateData.work;
      // 'date' 字段通常只在创建时设置，但 'lastMod' 可以更新
      delete mutableUpdateData.date;

      // Mongoose 默认会更新 'updatedAt' (如果开启 timestamps)，但这里我们有 'lastMod'
      // 如果 updateData 中没有提供 lastMod，并且您希望它在每次更新时自动更新，
      // 可以在 Mongoose Schema 的 pre('save') 钩子中处理，或者在这里显式设置。
      // 根据 ArtModel，lastMod 有 default: Date.now，这通常只在 insert 时生效。
      // 如果需要每次 update 都更新 lastMod，可以在此显式设置或 Schema pre('findOneAndUpdate')。
      mutableUpdateData.lastMod = new Date(); // 显式更新 lastMod

      const updatedArt = await Art.findByIdAndUpdate(
        artId,
        { $set: mutableUpdateData }, // 使用 $set 操作符更新部分字段
        { new: true, runValidators: true } // 返回更新后的文档，并运行 Schema 验证器
      );
      return updatedArt;
    } catch (error) {
      console.error(`更新作品 (ID: ${artId}) 时出错:`, error);
      throw new Error("无法更新作品。");
    }
  }

  /**
   * 按条件分页获取作品列表。
   * 支持多条件筛选、分页和排序。
   * @param page 当前页码 (从 1 开始)。
   * @param limit 每页作品数量。
   * @param filters MongoDB 查询筛选条件 (例如: { status: PageStatus.ONLINE, tags: { $in: ['popular'] } })。
   * @param sort 排序条件 (例如: { date: -1, totalStartCount: -1 })。
   * @returns 包含作品列表和总数的对象。
   */
  public async getPaginatedArts(
    page: number = 1,
    limit: number = 30,
    filters: FilterQuery<IArt> = {},
    sort: { [key: string]: SortOrder } = { lastMod: -1 } // 默认按最近修改时间降序
  ): Promise<{ arts: IArt[]; total: number }> {
    try {
      const skip = (page - 1) * limit;

      // 并行执行查询和计数，提高效率
      const [arts, total] = await Promise.all([Art.find(filters).sort(sort).skip(skip).limit(limit).exec(), Art.countDocuments(filters).exec()]);

      return { arts, total };
    } catch (error) {
      console.error("获取作品列表时出错:", error);
      throw new Error("无法检索作品列表。");
    }
  }

  /**
   * 按 ID 获取单个作品。
   * @param artId 作品的 MongoDB _id。
   * @returns 作品文档，如果未找到则为 null。
   */
  public async getArtById(artId: string): Promise<IArt | null> {
    try {
      const art = await Art.findById(artId);
      return art;
    } catch (error) {
      console.error(`获取作品 (ID: ${artId}) 时出错:`, error);
      throw new Error("无法检索作品。");
    }
  }

  // 根据您的要求，不提供 create 和 delete 方法
}

export default new ArtService();
