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

export enum ReferralRewardStatus {
    PENDING = 'PENDING',
    QUALIFIED = 'QUALIFIED',
    REWARDED = 'REWARDED',
    EXPIRED = 'EXPIRED',
    CANCELLED = 'CANCELLED'
}

@Schema({
    timestamps: {
        createdAt: 'created_at',
        updatedAt: 'updated_at',
    },
})
export class ReferralTracking {
    @Prop({ type: Types.ObjectId, ref: 'Users', required: true })
    referrer_id: Types.ObjectId; // User who shared the referral code

    @Prop({ type: Types.ObjectId, ref: 'Users', required: true })
    referred_user_id: Types.ObjectId; // User who joined using the code

    @Prop({ type: String, required: true })
    referral_code: string; // The referral code that was used

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

    @Prop({ type: Number, required: false, default: 0 })
    completed_orders: number; // Number of orders completed by referred user

    @Prop({ type: Number, required: false })
    required_orders: number; // Required orders to get reward (from settings at time of referral)

    @Prop({ type: Number, required: true })
    referral_date: number; // Timestamp when referral was made

    @Prop({ type: Number, required: true })
    expiry_date: number; // Timestamp when referral tracking expires

    @Prop({ type: Number, default: null })
    reward_date: number; // Timestamp when reward was given

    @Prop({ type: Number, default: 0 })
    reward_amount: number; // Amount rewarded

    @Prop({ type: Number, required: true })
    time_limit_days: number; // Time limit in days to complete required orders (from settings)

    @Prop({ type: Number, default: null })
    last_order_date: number; // Timestamp of last completed order

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

    @Prop({ type: Boolean, default: false })
    instant_reward_given: boolean;
    
    @Prop({ type: String, default: null })
    notes: string; // Additional notes or comments

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

export type ReferralTrackingDocument = HydratedDocument<ReferralTracking>;
export const ReferralTrackingSchema = SchemaFactory.createForClass(ReferralTracking);
