import mongoose, { Schema, PopulatedDoc, Document, Model } from "mongoose";
import SequenceFactory from "mongoose-sequence";
import { hasMigrated } from "@dbconfig";
import { populate, populateSelected } from "@functions";
import { IUser } from "@models/user";

const AutoIncrement = SequenceFactory(mongoose);

export interface IReview {
	_id: number;
	text: string;
	leftOn: number;
	whichChapter: number;
	author: PopulatedDoc<IUser & Document>;
	datePosted: Date;
	replyingTo: PopulatedDoc<IReview & Document> | null;
	replies: PopulatedDoc<IReview & Document>[];
}
const CommentSchema = new mongoose.Schema<IReview>({
	_id: {
		type: Number,
	},
	text: {
		type: String,
	},
	leftOn: {
		type: Number,
	},
	whichChapter: {
		type: Number,
	},
	author: {
		type: Number,
		ref: "User",
	},
	datePosted: {
		type: Date,
		default: new Date(),
	},
	replyingTo: {
		default: null,
		type: Number,
		ref: "Review",
	},
	replies: [
		{
			default: null,
			type: Number,
			ref: "Review",
		},
	],
});

CommentSchema.virtual("story", {
	ref: "Story",
	localField: "leftOn",
	foreignField: "_id",
	justOne: true,
});
const modelName = "Review";
CommentSchema
	// .pre("findOne", populateSelected("replyingTo", modelName, "-replies -author"))
	// .pre("find", populateSelected("replyingTo", modelName, "-replies -author"))
	.pre("findOne", populate("replies", modelName))
	.pre("find", populate("replies", modelName))
	.pre(
		"findOne",
		populateSelected("author", "User", "profile username _id blocked"),
	)
	.pre(
		"find",
		populateSelected("author", "User", "profile username _id blocked"),
	);

hasMigrated &&
	!mongoose.models.Review &&
	CommentSchema.plugin(AutoIncrement, { id: "reviews" });

export const Review: Model<IReview> =
	/* mongoose.models.Review || */ mongoose.model(
		modelName,
		CommentSchema,
		"reviews",
	);