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

export interface GiftVoucherDoc {
  _id: string;
  // Leer, bis der Gutschein bezahlt ist — erst dann wird ein Code vergeben
  // und verschickt (kein Wert ohne Bezahlung im Umlauf).
  code: string;
  amount: number;
  purchaserName: string;
  purchaserEmail: string;
  recipientName: string;
  message: string;
  // Sprache der Anfrageseite zum Zeitpunkt der Anfrage — Code-/Bestätigungs-
  // Mail kommt oft erst Tage später (manuelle Bestätigung oder Stripe-
  // Webhook), außerhalb des ursprünglichen Request-Kontexts, daher hier
  // festgehalten statt zur Versandzeit neu zu raten.
  locale: "de" | "en";
  paid: boolean;
  paidAt: Date | null;
  // Manuell (Überweisung/bar, von Rakku bestätigt) vs. automatisch per
  // Stripe — rein informativ für die Admin-Übersicht.
  paymentMethod: "stripe" | "manual" | "";
  cancelled: boolean;
  redeemed: boolean;
  redeemedByClientId: mongoose.Types.ObjectId | null;
  redeemedOrderId: mongoose.Types.ObjectId | null;
  redeemedAt: Date | null;
  stripeSessionId: string;
  // Gutscheine verjähren in Deutschland nach 3 Jahren (§ 195 BGB) — Standard
  // gesetzt, admin kann ihn beim manuellen Ausstellen überschreiben.
  expiresAt: Date | null;
  // Verhindert wiederholte Ablauf-Erinnerungsmails an Rakku für denselben
  // Gutschein bei jedem Cron-Lauf.
  expiryReminderSent: boolean;
  createdAt: Date;
}

const giftVoucherSchema = new Schema<GiftVoucherDoc>(
  {
    code: { type: String, default: "", trim: true, uppercase: true, index: true },
    amount: { type: Number, required: true, min: 1 },
    purchaserName: { type: String, required: true, trim: true, maxlength: 200 },
    // Bei Bulk-Erstellung (z. B. Convention-Verlosung) gibt es noch keine
    // einzelne Käufer-Mail — deshalb nicht mehr zwingend erforderlich.
    purchaserEmail: { type: String, default: "", trim: true, lowercase: true, maxlength: 200 },
    recipientName: { type: String, default: "", trim: true, maxlength: 200 },
    message: { type: String, default: "", trim: true, maxlength: 500 },
    locale: { type: String, enum: ["de", "en"], default: "de" },
    paid: { type: Boolean, default: false },
    paidAt: { type: Date, default: null },
    paymentMethod: { type: String, enum: ["stripe", "manual", ""], default: "" },
    cancelled: { type: Boolean, default: false },
    redeemed: { type: Boolean, default: false },
    redeemedByClientId: { type: Schema.Types.ObjectId, ref: "Client", default: null },
    redeemedOrderId: { type: Schema.Types.ObjectId, ref: "Order", default: null },
    redeemedAt: { type: Date, default: null },
    stripeSessionId: { type: String, default: "" },
    expiresAt: { type: Date, default: null },
  },
  { timestamps: true }
);

export const GiftVoucher =
  (models.GiftVoucher as mongoose.Model<GiftVoucherDoc>) || model<GiftVoucherDoc>("GiftVoucher", giftVoucherSchema);
