import mongoose, { Schema, models, model } from "mongoose";

export type DiscountType = "percent" | "fixed";

export interface DiscountCodeDoc {
  _id: string;
  code: string;
  type: DiscountType;
  value: number;
  maxUses: number | null;
  usedCount: number;
  validUntil: Date | null;
  // Nur für Kunden mit mehr als einem Auftrag einlösbar, siehe Stammkunde-Badge.
  stammkundenOnly: boolean;
  // Gegenstück zu stammkundenOnly — nur einlösbar, wenn der aktuelle Auftrag
  // der einzige Auftrag des Kunden ist (also noch kein vorheriger existiert).
  neukundenOnly: boolean;
  // Gesetzt bei automatisch erzeugten Empfehlungsprämien-Codes (siehe
  // lib/actions/referrals.ts) — nur dieser eine Kunde darf den Code einlösen.
  // Bei regulären, admin-angelegten Marketing-Codes bleibt es null.
  ownerId: mongoose.Types.ObjectId | null;
  // Optional an eine Convention gebunden — dann nur einlösbar, wenn der
  // Auftrag zu genau dieser Convention gehört (Order.conventionId).
  conventionId: mongoose.Types.ObjectId | null;
  active: boolean;
  note: string;
  createdAt: Date;
}

const discountCodeSchema = new Schema<DiscountCodeDoc>(
  {
    code: { type: String, required: true, unique: true, uppercase: true, trim: true, maxlength: 40 },
    type: { type: String, enum: ["percent", "fixed"], default: "percent" },
    value: { type: Number, required: true, min: 0 },
    maxUses: { type: Number, default: null },
    usedCount: { type: Number, default: 0, min: 0 },
    validUntil: { type: Date, default: null },
    stammkundenOnly: { type: Boolean, default: false },
    neukundenOnly: { type: Boolean, default: false },
    ownerId: { type: Schema.Types.ObjectId, ref: "Client", default: null },
    conventionId: { type: Schema.Types.ObjectId, ref: "Convention", default: null },
    active: { type: Boolean, default: true },
    note: { type: String, default: "", trim: true, maxlength: 300 },
  },
  { timestamps: true }
);

export const DiscountCode =
  (models.DiscountCode as mongoose.Model<DiscountCodeDoc>) ||
  model<DiscountCodeDoc>("DiscountCode", discountCodeSchema);
