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

export interface ReminderDoc {
  _id: string;
  invoiceId: mongoose.Types.ObjectId;
  orderId: mongoose.Types.ObjectId;
  clientId: mongoose.Types.ObjectId;
  level: number;
  invoiceNumber: string;
  // Zusatzgebühr, die genau bei dieser Mahnstufe neu hinzukommt (0 bei der
  // meist gebührenfreien ersten Zahlungserinnerung) — amountDue enthält
  // bereits die Summe aus Rechnungsbetrag + allen bis hierhin aufgelaufenen
  // Gebühren, fee ist nur für die Aufschlüsselung auf der Mahnung selbst.
  fee: number;
  amountDue: number;
  dueDate: Date;
  note: string;
  // War diese Mahnstufe automatisch (Cron) oder manuell ausgelöst — rein
  // informativ, damit im Verlauf nachvollziehbar bleibt, wie sie entstand.
  automatic: boolean;
  createdAt: Date;
}

const reminderSchema = new Schema<ReminderDoc>(
  {
    invoiceId: { type: Schema.Types.ObjectId, ref: "Invoice", required: true, index: true },
    orderId: { type: Schema.Types.ObjectId, ref: "Order", required: true, index: true },
    clientId: { type: Schema.Types.ObjectId, ref: "Client", required: true },
    level: { type: Number, required: true },
    invoiceNumber: { type: String, required: true },
    fee: { type: Number, default: 0, min: 0 },
    amountDue: { type: Number, required: true },
    dueDate: { type: Date, required: true },
    note: { type: String, default: "", trim: true, maxlength: 500 },
    automatic: { type: Boolean, default: false },
  },
  { timestamps: true }
);

// Verhindert zwei Mahnungen derselben Stufe für dieselbe Rechnung — z. B. bei
// einem Doppelklick auf "Mahnung senden" oder einem überlappenden Cron-Lauf,
// die beide gleichzeitig dieselbe (nicht-atomare) Stufen-Berechnung in
// createReminderForOrder durchlaufen. Siehe dortiger Duplicate-Key-Fang.
reminderSchema.index({ invoiceId: 1, level: 1 }, { unique: true });

export const Reminder =
  (models.Reminder as mongoose.Model<ReminderDoc>) || model<ReminderDoc>("Reminder", reminderSchema);
