import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { Document, Types } from 'mongoose';
import mongoose from 'mongoose';

export type BroadcastDocument = Broadcast & Document;

export enum BroadcastType {
    NOTIFICATION = 'NOTIFICATION',
    EMAIL = 'EMAIL',
    BOTH = 'BOTH'
}

export enum BroadcastTarget {
    ALL = 'ALL',
    ONLY_USERS = 'ONLY_USERS',
    ONLY_VENDORS = 'ONLY_VENDORS',
    SPECIFIC_USERS = 'SPECIFIC_USERS'
}

export enum BroadcastStatus {
    PENDING = 'PENDING',
    PROCESSING = 'PROCESSING',
    COMPLETED = 'COMPLETED',
    FAILED = 'FAILED',
    PARTIALLY_FAILED = 'PARTIALLY_FAILED'
}

@Schema()
export class Broadcast extends Document {
    @Prop({ type: String, enum: BroadcastType, required: true })
    type: BroadcastType;

    @Prop({ type: String, enum: BroadcastTarget, required: true })
    target: BroadcastTarget;

    @Prop({ type: String, required: true })
    title: string;

    @Prop({ type: String, required: true })
    message: string;

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

    @Prop({ type: [mongoose.Schema.Types.ObjectId], ref: 'users', default: [] })
    target_users: Types.ObjectId[];

    @Prop({ type: mongoose.Schema.Types.ObjectId, ref: 'users', required: true })
    created_by: Types.ObjectId;

    @Prop({ type: String, enum: BroadcastStatus, default: BroadcastStatus.PENDING })
    status: BroadcastStatus;

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

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

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

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

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

    @Prop({ type: Number, default: null })
    started_at: number;

    @Prop({ type: Number, default: null })
    completed_at: number;

    @Prop({ type: Number, default: +new Date() })
    created_at: number;

    @Prop({ type: Number, default: +new Date() })
    updated_at: number;
}

export const BroadcastSchema = SchemaFactory.createForClass(Broadcast);
