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

// --- 定义常量 (使用 TypeScript 枚举或常量对象) ---

// Special 缩略图类型
export enum SpecialThumbType {
  OUTLINE = 0, // special切线图
  GRAY = 1, // special灰度图
  UPLOAD = 2, // 设计师上传的special缩略图
  GRADIENT = 3, // special渐变切线图
}

// 页面状态
export enum PageStatus {
  REFUSE = 500, // 拒稿
  NEW = 1000, // 草稿
  MODIFY = 2000, // 修改中
  TESTING = 3000, // 测试中
  READY = 7000, // 可以上线
  OFFLINE = 8000, // 下线
  ONLINE = 9000, // 线上
}

// 定义 Art 文档的 TypeScript 接口
// 扩展 mongoose.Document 以包含 Mongoose 提供的 _id 属性
// 注意: createdAt 和 updatedAt 不会自动添加，但 Document 接口仍可能包含这些属性定义
export interface IArt extends Document {
  status: PageStatus; // 状态，使用枚举类型
  pageId: mongoose.Types.ObjectId; // Page Id
  user: mongoose.Types.ObjectId; // 作者，关联 Designer
  from?: string; // 素材来源

  work?: mongoose.Types.ObjectId; // 上色效果图

  pageVersion: number; // 底稿版本

  areaCount: number; // 区块数
  areaCountFloor: number; // 区块数/100向下取整
  coloredAreaCount: number; // 填色区块数
  colorCount: number; // 颜色数
  orderedColorCount: number; // 已排序颜色数
  colorOrderStatus: number; // 排序状态 (0-未排序，1-部分排序，2-已排序)

  mapVersion: number; // map版本
  workVersion: number; // work版本
  centersVersion: number; // 中心点版本

  hasSpecial: boolean; // 是否有special
  specialVersion: number; // Special图版本
  specialPkmVersion: number; // SpecialPkm版本
  useSpecialThumb: SpecialThumbType; // 当前Special缩略图，使用枚举类型

  mystery: boolean; // 是否神秘图
  ai: boolean; // 是否AI参考图
  aiPrompt?: string; // AI关键字

  width: number; // 宽
  height: number; // 高
  name: string; // 作品名
  desc?: string; // 作品描述
  use: string; // 用途
  tags: string[]; // 标签
  epgs: string[]; // EPG

  date: Date; // 上传时间
  lastMod: Date; // 修改时间
  timeSubmit?: Date; // 提测时间
  timeReady?: Date; // 通过时间

  refuseReason?: string; // 拒稿原因

  lock: boolean; // 是否上锁
  publishVersion: number; // 发布版本
  publishTime?: Date; // 发布时间
  publishBy?: mongoose.Types.ObjectId; // 发布者，关联 Designer
  order: number;

  drop: boolean; // 标记删除
  dropReason?: string; // 删除原因

  score?: number; // 总体评分0-5

  // 统计数据
  totalStartCount?: number; // 总开始数
  totalDoneCount?: number; // 总完成数
  completionRate?: number; // 完成比例

  // 虚拟字段 (不会存储在数据库中，但在 toJSON/toObject 时会计算)
  thumb?: string;

  // 如果没有 timestamps: true，这些字段将不会被 Mongoose 自动管理
  // 但如果它们在您的底层数据中存在，它们仍然是 Document 接口的一部分
  // createdAt?: Date;
  // updatedAt?: Date;
}

// 定义 Art Schema
const ArtSchema: Schema = new Schema<IArt>(
  {
    status: { type: Number, required: true, index: true, default: 1000 /* desc: '状态' */ },
    pageId: { type: Schema.Types.ObjectId, required: true /* desc: 'Page Id' */ },
    user: { type: Schema.Types.ObjectId, ref: "Designer", required: true, index: true /* desc: '作者' */ },
    from: { type: String /* desc: '素材来源' */ },

    work: { type: Schema.Types.ObjectId, ref: "ArtBin" /*desc: '上色效果',*/ }, // 👈 关键修改：添加 work 字段到 Schema

    pageVersion: { type: Number, default: 1 /* desc: '底稿版本' */ },

    areaCount: { type: Number, required: true /* desc: '区块数' */ },
    areaCountFloor: { type: Number, required: true, index: true /* desc: '区块数/100向下取整' */ },
    coloredAreaCount: { type: Number, default: 0 /* desc: '填色区块数' */ },
    colorCount: { type: Number, default: 0 /* desc: '颜色数' */ },
    orderedColorCount: { type: Number, default: 0 /* desc: '已排序颜色数' */ },
    colorOrderStatus: { type: Number, default: 0 /* desc: '排序状态' */ },

    mapVersion: { type: Number, required: true, default: 1 /* desc: 'map版本' */ },
    workVersion: { type: Number, required: true, default: 1 /* desc: 'work版本' */ },
    centersVersion: { type: Number, required: true, default: 0 /* desc: '中心点版本' */ },

    hasSpecial: { type: Boolean, default: false, index: true /* desc: '是否有special' */ },
    specialVersion: { type: Number, default: 0 /* desc: 'Special图版本' */ },
    specialPkmVersion: { type: Number, default: 0 /* desc: 'SpecialPkm版本' */ },
    useSpecialThumb: { type: Number, required: true, default: 0 /* desc: '当前Special缩略图' */ },

    mystery: { type: Boolean, default: false, index: true /* desc: '是否神秘图' */ },
    ai: { type: Boolean, default: false, index: true /* desc: '是否AI参考图' */ },
    aiPrompt: { type: String /* desc: 'AI关键字' */ },

    width: { type: Number, required: true, index: true /* desc: '宽' */ },
    height: { type: Number, index: true, required: true /* desc: '高' */ },
    name: { type: String, required: true /* desc: '作品名' */ },
    desc: { type: String /* desc: '作品描述' */ },
    use: { type: String, required: true, index: true, default: "normal", lowercase: true, trim: true /* desc: '用途' */ },
    tags: { type: [String], index: true, lowercase: true, trim: true /* desc: '标签' */ },

    epgs: { type: [String], index: true, trim: true /* desc: 'EPG' */ },

    date: { type: Date, default: Date.now, index: true /* desc: '上传时间' */ },
    lastMod: { type: Date, default: Date.now, index: true /* desc: '修改时间' */ },
    timeSubmit: { type: Date, index: true /* desc: '提测时间' */ },
    timeReady: { type: Date, index: true /* desc: '通过时间' */ },

    refuseReason: { type: String /* desc: '拒稿原因' */ },

    lock: { type: Boolean, default: false, index: true /* desc: '是否上锁' */ },
    publishVersion: { type: Number, default: 0, index: true /* desc: '发布版本' */ },
    publishTime: { type: Date, index: true /* desc: '发布时间' */ },
    publishBy: { type: Schema.Types.ObjectId, ref: "Designer", index: true /* desc: '发布者' */ },
    order: { type: Number, default: 0, index: true },

    drop: { type: Boolean, default: false, index: true /* desc: '标记删除' */ },
    dropReason: { type: String /* desc: '删除原因' */ },

    score: { type: Number /* desc: '评分' */ },

    ////////////////////////// 统计数据 ////////////////////////////
    totalStartCount: { type: Number, index: true /* desc: '总开始数' */ },
    totalDoneCount: { type: Number, index: true /* desc: '总完成数' */ },
    completionRate: { type: Number, index: true /* desc: '完成比例' */ },
  },
  {
    strict: true,
    toJSON: {
      virtuals: true,
      transform: artTransform,
    },
    toObject: {
      virtuals: true,
      transform: artTransform,
    },
  }
);

// Art 转换函数 (虚拟字段 thumb 的逻辑)
function artTransform(doc: IArt, ret: Record<string, any>) {
  // make thumb for art.
  // 确保 doc.lastMod 存在或提供默认值，以避免运行时错误
  const lastModTime = doc.lastMod ? doc.lastMod.getTime() : Date.now();
  ret.thumb = `/thumbs/v2/page/320/${doc.pageId}.png?t=${lastModTime}`;

  if (doc.work && doc.hasSpecial) {
    ret.thumb = `/thumbs/v2/special/320/${doc._id}.png?t=${lastModTime}`;
  } else if (doc.work) {
    ret.thumb = `/thumbs/v2/work/320/${doc._id}.png?t=${lastModTime}`;
  }
}

// 复合索引
ArtSchema.index({
  order: -1,
  publishTime: -1,
});

// 创建并导出 Art Model
const Art = mongoose.model<IArt>("Art", ArtSchema);
export default Art;
