/**
 * Pricing Category Model
 * Defines top-level groupings for pricing items (e.g., Modules, AI Providers, Languages).
 * These are configuration-driven — adding a new category does not require code changes.
 */

import mongoose, { Schema, Document } from 'mongoose';

export type PricingCategorySelectionType = 'single' | 'multiple' | 'quantity';

export interface IPricingCategory extends Document {
  slug: string;
  name: string;
  description?: string;
  icon?: string;
  sortOrder: number;
  selectionType: PricingCategorySelectionType;
  isRequired: boolean;
  isActive: boolean;
  createdAt: Date;
  updatedAt: Date;
}

const PricingCategorySchema = new Schema<IPricingCategory>({
  slug: {
    type: String,
    required: [true, 'Category slug is required'],
    unique: true,
    trim: true,
    lowercase: true,
    match: [/^[a-z0-9_]+$/, 'Slug must contain only lowercase letters, numbers, and underscores'],
  },
  name: {
    type: String,
    required: [true, 'Category name is required'],
    trim: true,
    maxlength: [100, 'Category name cannot exceed 100 characters'],
  },
  description: {
    type: String,
    trim: true,
    maxlength: [500, 'Description cannot exceed 500 characters'],
  },
  icon: {
    type: String,
    trim: true,
    maxlength: [50, 'Icon name cannot exceed 50 characters'],
  },
  sortOrder: {
    type: Number,
    default: 0,
  },
  selectionType: {
    type: String,
    enum: ['single', 'multiple', 'quantity'],
    default: 'multiple',
  },
  isRequired: {
    type: Boolean,
    default: false,
  },
  isActive: {
    type: Boolean,
    default: true,
  },
}, {
  timestamps: true,
  toJSON: { virtuals: true },
  toObject: { virtuals: true },
});

PricingCategorySchema.index({ slug: 1 }, { unique: true });
PricingCategorySchema.index({ isActive: 1, sortOrder: 1 });

export const PricingCategory = mongoose.models.PricingCategory || mongoose.model<IPricingCategory>('PricingCategory', PricingCategorySchema);