import mongoose, { Schema, PopulatedDoc, Document, Model } from "mongoose";
import SequenceFactory from "mongoose-sequence";
import { hasMigrated } from "~/lib/dbconfig";
import { populate, populateSelected } from "~/lib/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,
});

CommentSchema.pre("findOne", populate("replies"))
	.pre("find", populate("replies"))
	.pre("findOne", populate("commentAuthor"))
	.pre("find", populate("commentAuthor"))
	.pre("findOne", populateSelected("replyingTo", "-replies"))
	.pre("find", populateSelected("replyingTo", "-replies"));

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

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