import mongoose, { Document, Model, Schema } from 'mongoose';
import './Student';
import './Order';
import './Course';
import './Lesson';

export interface ICoursePurchaseHistory extends Document {
  student: mongoose.Types.ObjectId;
  order: mongoose.Types.ObjectId;
  courseId: mongoose.Types.ObjectId;
  lessons: mongoose.Types.ObjectId[];
  amountPaid: number;
  currency: string;
  discountApplied: number;
  paymentMethod: 'stripe' | 'paypal' | 'bank_transfer';
  transactionId: string;
  paymentStatus: 'pending' | 'completed' | 'failed' | 'refunded';
  purchasedAt: Date;
  createdAt: Date;
  updatedAt: Date;
}

const CoursePurchaseHistorySchema: Schema<ICoursePurchaseHistory> = new Schema(
  {
    student: {
      type: Schema.Types.ObjectId,
      ref: 'Student',
      required: [true, 'Student reference is required'],
      index: true,
    },
    order: {
      type: Schema.Types.ObjectId,
      ref: 'Order',
      required: [true, 'Order reference is required'],
      index: true,
    },
    courseId: {
      type: Schema.Types.ObjectId,
      ref: 'Course',
      required: [true, 'Course reference is required'],
      index: true,
    },
    lessons: [
      {
        type: Schema.Types.ObjectId,
        ref: 'Lesson',
        default: [],
      },
    ],
    amountPaid: {
      type: Number,
      required: [true, 'Amount paid is required'],
      min: [0, 'Amount cannot be negative'],
    },
    currency: {
      type: String,
      default: 'EUR',
      uppercase: true,
    },
    discountApplied: {
      type: Number,
      default: 0,
      min: [0, 'Discount cannot be negative'],
    },
    paymentMethod: {
      type: String,
      enum: {
        values: ['stripe', 'paypal', 'bank_transfer'],
        message: '{VALUE} is not a valid payment method',
      },
      required: [true, 'Payment method is required'],
      index: true,
    },
    transactionId: {
      type: String,
      required: [true, 'Transaction ID is required'],
      trim: true,
      index: true,
    },
    paymentStatus: {
      type: String,
      enum: {
        values: ['pending', 'completed', 'failed', 'refunded'],
        message: '{VALUE} is not a valid payment status',
      },
      default: 'completed',
      index: true,
    },
    purchasedAt: {
      type: Date,
      default: Date.now,
      index: true,
    },
  },
  {
    timestamps: true,
  }
);

// Indexes
CoursePurchaseHistorySchema.index({ student: 1, purchasedAt: -1 });
CoursePurchaseHistorySchema.index({ courseId: 1 });

if (mongoose.models && mongoose.models.CoursePurchaseHistory) {
  delete (mongoose.models as any).CoursePurchaseHistory;
}

export const CoursePurchaseHistory: Model<ICoursePurchaseHistory> =
  mongoose.models.CoursePurchaseHistory ||
  mongoose.model<ICoursePurchaseHistory>('CoursePurchaseHistory', CoursePurchaseHistorySchema);

export default CoursePurchaseHistory;
