/**
 * Commission Payout Model
 * Groups commission records into payout batches per rep and period,
 * tracking payment method and status.
 */

import mongoose, { Schema, Document } from 'mongoose';

// ============================================
// TYPE DEFINITIONS
// ============================================

export type PayoutStatus = 'pending' | 'processing' | 'paid' | 'failed';

export interface ICommissionPayout extends Document {
  companyId: string;
  periodStart?: string;
  periodEnd?: string;
  repId: string;
  repName?: string;
  totalCommissionAmount?: number;
  totalDealsCount?: number;
  status: PayoutStatus;
  paidDate?: string;
  paymentMethod?: string;
  paymentReference?: string;
  commissionIds: string[];
  notes?: string;

  createdAt: Date;
  updatedAt: Date;
}

// ============================================
// MAIN SCHEMA
// ============================================

const CommissionPayoutSchema = new Schema<ICommissionPayout>(
  {
    companyId: {
      type: String,
      required: [true, 'Company ID is required'],
      index: true,
    },
    periodStart: { type: String },
    periodEnd: { type: String },
    repId: {
      type: String,
      required: [true, 'Rep ID is required'],
    },
    repName: { type: String, trim: true },
    totalCommissionAmount: { type: Number, default: 0 },
    totalDealsCount: { type: Number, default: 0 },
    status: {
      type: String,
      enum: ['pending', 'processing', 'paid', 'failed'],
      default: 'pending',
    },
    paidDate: { type: String },
    paymentMethod: { type: String, trim: true },
    paymentReference: { type: String, trim: true },
    commissionIds: { type: [String], default: [] },
    notes: { type: String, trim: true },
  },
  { timestamps: true }
);

// Indexes
CommissionPayoutSchema.index({ companyId: 1, repId: 1 });
CommissionPayoutSchema.index({ companyId: 1, status: 1 });

export const CommissionPayout = mongoose.models.CommissionPayout || mongoose.model<ICommissionPayout>('CommissionPayout', CommissionPayoutSchema);