/**
 * Commission Plan Model
 * Defines commission structures, tiers, accelerators, and payout frequencies
 * for sales compensation management.
 */

import mongoose, { Schema, Document } from 'mongoose';

// ============================================
// TYPE DEFINITIONS
// ============================================

export type PlanType = 'percentage' | 'flat-rate' | 'tiered' | 'accelerator' | 'hybrid';

export type PayoutFrequency = 'monthly' | 'quarterly' | 'annually' | 'on-close' | 'custom';

export interface ICommissionTier extends Document {
  minAmount: number;
  maxAmount: number;
  rate: number;
  label: string;
}

export interface ICommissionAccelerator extends Document {
  threshold: number;
  multiplier: number;
  label: string;
}

export interface ICommissionPlan extends Document {
  companyId: string;
  name: string;
  description?: string;
  planType: PlanType;
  baseRate: number;
  tiers: ICommissionTier[];
  accelerators: ICommissionAccelerator[];
  payoutFrequency: PayoutFrequency;
  effectiveFrom?: string;
  effectiveTo?: string;
  isActive: boolean;

  createdAt: Date;
  updatedAt: Date;
}

// ============================================
// SUB-SCHEMAS
// ============================================

const CommissionTierSchema = new Schema<ICommissionTier>(
  {
    minAmount: { type: Number, default: 0 },
    maxAmount: { type: Number, default: 0 },
    rate: { type: Number, default: 0 },
    label: { type: String, trim: true },
  },
  { _id: false }
);

const CommissionAcceleratorSchema = new Schema<ICommissionAccelerator>(
  {
    threshold: { type: Number, default: 0 },
    multiplier: { type: Number, default: 0 },
    label: { type: String, trim: true },
  },
  { _id: false }
);

// ============================================
// MAIN SCHEMA
// ============================================

const CommissionPlanSchema = new Schema<ICommissionPlan>(
  {
    companyId: {
      type: String,
      required: [true, 'Company ID is required'],
      index: true,
    },
    name: {
      type: String,
      required: [true, 'Name is required'],
      trim: true,
    },
    description: { type: String, trim: true },
    planType: {
      type: String,
      enum: ['percentage', 'flat-rate', 'tiered', 'accelerator', 'hybrid'],
      default: 'percentage',
    },
    baseRate: {
      type: Number,
      required: [true, 'Base rate is required'],
    },
    tiers: { type: [CommissionTierSchema], default: [] },
    accelerators: { type: [CommissionAcceleratorSchema], default: [] },
    payoutFrequency: {
      type: String,
      enum: ['monthly', 'quarterly', 'annually', 'on-close', 'custom'],
      default: 'monthly',
    },
    effectiveFrom: { type: String },
    effectiveTo: { type: String },
    isActive: { type: Boolean, default: true },
  },
  { timestamps: true }
);

// Indexes
CommissionPlanSchema.index({ companyId: 1, isActive: 1 });
CommissionPlanSchema.index({ companyId: 1, planType: 1 });

export const CommissionPlan = mongoose.models.CommissionPlan || mongoose.model<ICommissionPlan>('CommissionPlan', CommissionPlanSchema);