import { Prop, Schema, SchemaFactory } from "@nestjs/mongoose";
import mongoose, { HydratedDocument, Types } from "mongoose";
import * as  moment from "moment";

export enum chatDisappearing {
    OFF = "OFF",
    HOURS_24 = "HOURS_24",
    DAYS_7 = "DAYS_7",
    DAYS_90 = "DAYS_90",
}

export enum ConnectionTypes {
    NORMAL = "NORMAL",
    GROUP = "GROUP",
}

export enum AppearanceType {
    WITH_PROFILE_IMAGE = "WITH_PROFILE_IMAGE",
    RECIEVER_PROFILE_IMAGE = "RECIEVER_PROFILE_IMAGE",
    WITHOUT_PROFILE_IMAGE = "WITHOUT_PROFILE_IMAGE",
}

export type ConnectionDocument = HydratedDocument<Connection>;

@Schema()
export class Connection {
    @Prop({ type: mongoose.Schema.Types.ObjectId, ref: "user", required: false, default: null })
    sent_by: Types.ObjectId;

    @Prop({ type: mongoose.Schema.Types.ObjectId, ref: "user", required: false, default: null })
    sent_to: Types.ObjectId;

    @Prop({ default: null })
    group_name: string;

    @Prop({ type: Types.ObjectId, ref: 'users', required: false, default: null })
    group_creator_id: Types.ObjectId;

    @Prop({ default: null })
    group_image_url: string;

    @Prop({ default: ConnectionTypes.NORMAL, enum: ConnectionTypes })
    connection_type: string;

    @Prop([{ type: [Types.ObjectId], ref: "users", default: [] }])
    connection_locked_by: Types.ObjectId[];

    @Prop([{ type: [Types.ObjectId], ref: "users", default: null }])
    connection_pinned_by: Types.ObjectId[];

    @Prop([{ type: [Types.ObjectId], ref: "users", default: null }])
    connection_deleted_by: Types.ObjectId[];

    @Prop([{ type: [Types.ObjectId], ref: "users", default: null }])
    connection_archived_by: Types.ObjectId[];

    @Prop({
        type: [{
            user_id: { type: Types.ObjectId, ref: "users", default: null },
            chat_disappearing: { type: String, enum: chatDisappearing, default: null },
            chat_disapear_for: { type: String, default: null }
        }],
        default: [] // Ensures an empty array by default
    })
    chat_disappear_by: Array<{ user_id: Types.ObjectId, chat_disappearing: chatDisappearing, chat_disapear_for: string }>;

    @Prop({ default: chatDisappearing.OFF, enum: chatDisappearing })
    chat_disappearing: string;

    @Prop({
        type: [{
            user_id: { type: Types.ObjectId, ref: "users", default: null },
            time: { type: Number, required: true },
            type: { type: String, enum: ["HOUR", "WEEK", "ALWAYS", null], default: null }
        }],
        default: [] // Ensures an empty array by default
    })
    connection_muted_by: Array<{ user_id: Types.ObjectId, time: number, type: "HOUR" | "WEEK" | "ALWAYS" | null }>;

    @Prop({ default: moment().utc().valueOf() })
    updated_at: number;

    @Prop({ default: moment().utc().valueOf() })
    created_at: number;
}

export const ConnectionSchema = SchemaFactory.createForClass(Connection);
