import { Prop, Schema, SchemaFactory } from "@nestjs/mongoose";
import { Document, Types } from "mongoose";
import mongoose from "mongoose";
import * as moment from "moment";
const message_type = [
    null,
    "MEDIA",
    "TEXT",
    "IMAGE",
    "VIDEO",
    "AUDIO",
    "DOCUMENT",
    "LOCATION",
    "LIVE_LOCATION",
    "CURRENT_LOCATION",
    "EMERGENCY_LOCATION",
    "CALL",
    "VOICE_NOTE",
    "GIF",
    "LINK",
    "STICKER"
];
const type = [null, "NORMAL", "REPLY", "FORWARDED", "MEDIA", "DISAPPEARING"];

const message_status = [null, "SENT", "DELIVERED", "READ"];
export enum connectionType { NORMAL = "NORMAL", GROUP = "GROUP" };

export type MessageDocument = Message & Document;

@Schema()
export class Message {

    @Prop({ type: String, enum: connectionType, default: connectionType.NORMAL, })
    connection_type: string;

    @Prop({ type: mongoose.Schema.Types.ObjectId, ref: "connections" })
    connection_id: Types.ObjectId;

    @Prop({ type: mongoose.Schema.Types.ObjectId, ref: "users" })
    sent_by: Types.ObjectId;

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

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

    @Prop({ type: mongoose.Schema.Types.ObjectId, ref: "messages" })
    reply_msg_id: Types.ObjectId;

    @Prop({ default: null, enum: type })
    type: string;

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

    @Prop({ default: "TEXT", enum: message_type })
    message_type: string;

    @Prop({ default: "NORMAL" })
    message: string;

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

    @Prop({ default: 0 })
    duration: Number;

    @Prop([{
        type: {
            type: String,
            enum: message_type,
            default: null,
        },
        url: {
            type: String,
            default: null,
        },
        thumbnail: {
            type: String,
            default: null,
        },
        caption: {
            type: String,
            default: null,
        },
        duration: {
            type: Number,
            default: 0,
        },
    },])
    media: {
        type: string;
        url: string | null;
        thumbnail: string | null;
        caption: string | null;
        duration: number | null;
    }[];

    @Prop([{
        user_id: { type: Types.ObjectId, ref: "users", default: null },
        read_at: {
            type: Number,
            default: 0,
        },
    },])
    read_by: {
        user_id: string;
        read_at: number | null;
    }[];

    @Prop([{
        user_id: { type: Types.ObjectId, ref: "users", default: null },
        delivered_at: {
            type: Number,
            default: 0,
        },
    },])
    delivered_to: {
        user_id: string;
        delivered_at: number;
    }[];

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

    @Prop({ type: Object, default: null })
    call_data: any;

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

    @Prop({
        type: [{
            user_id: { type: Types.ObjectId, ref: "users", default: null },
            is_already_disappeared: { type: Boolean },
            is_disappeared_msg: { type: Boolean },
            msg_disappearing_date: { type: Number },
        }],
        default: [] // Ensures an empty array by default
    })
    chat_disappear_by: Array<{
        user_id: Types.ObjectId,
        is_already_disappeared: boolean,
        is_disappeared_msg: boolean,
        msg_disappearing_date: number
    }>;

    @Prop()
    msg_disappearing_date: number = 0;
     
    @Prop({ default: false })
    is_disappeared_msg: boolean;
    
    @Prop({ default: false })
    is_already_disappeared: boolean;
    
    @Prop({ default: false })
    is_deleted: boolean;
 
    @Prop({ default: false })
    is_edited: boolean;

    @Prop({ default: "SENT", enum: message_status })
    message_status: string;

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

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

    @Prop({ type: Boolean, default: false })
    is_live_location_ended: boolean = false;

    @Prop({ type: Number, default: 0 })
    live_end_at: number;

    @Prop()
    read_at: number = moment().utc().valueOf();

    @Prop({
        type: [{
            user_id: { type: Types.ObjectId, ref: "users", default: null },
            pinned_for: { type: String },
            pinned_at: { type: Number },
            pinned_to: { type: Number },
        }],
        default: [] // Ensures an empty array by default
    })
    chat_pinned_by: Array<{
        user_id: Types.ObjectId,
        pinned_for: string,
        pinned_to: number,
        pinned_at: number
    }>;


    @Prop()
    updated_at: number = moment().utc().valueOf();

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

export const MessageSchema = SchemaFactory.createForClass(Message);
