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

export interface ClientPhotoFolderDoc {
  _id: string;
  clientId: mongoose.Types.ObjectId;
  // Optional — nur gesetzt, wenn der Ordner beim Zuweisen direkt aus einem
  // Auftrag heraus angelegt wurde. Steuert das automatische Wasserzeichen auf
  // Vorschau-/Vollbildern, solange der zugehörige Auftrag noch nicht als
  // bezahlt markiert ist (siehe api/photos/[folderId]/[filename]). Ordner
  // ohne Auftragsbezug (z. B. "Foto-Ordner ohne Auftrag") bleiben null und
  // damit nie wasserzeichenbehaftet.
  orderId: mongoose.Types.ObjectId | null;
  nextcloudPath: string;
  // Dient als Titel in der Kunden-/Admin-Ansicht (z. B. "Convention Shooting
  // Mai 2026") — bewusst nicht "title" genannt, um bestehende Dokumente ohne
  // Migration weiterzuverwenden.
  label: string;
  // Datum, zu dem die Fotos entstanden sind — admin-editierbar, nicht
  // zwingend der Tag, an dem der Ordner im System zugewiesen wurde (z. B.
  // bei nachträglich erfassten Bestandskunden).
  assignedAt: Date;
  sortOrder: number;
  // Gesetzt, sobald der Kunde einen Teilen-Link für diesen Ordner aktiviert
  // hat (z. B. für Familie/Freunde ohne eigenes Konto) — null bedeutet
  // deaktiviert. Ein zufälliger Token statt der Ordner-ID selbst, damit sich
  // Ordner-IDs nicht einfach durchraten lassen.
  shareToken?: string | null;
  // Läuft automatisch 30 Tage nach Aktivierung/letzter Verlängerung ab (siehe
  // toggleFolderShareAction/extendFolderShareAction) — ein einmal erzeugter
  // Teilen-Link blieb vorher für immer gültig, auch wenn er längst nicht mehr
  // gebraucht wird.
  shareTokenExpiresAt?: Date | null;
  // Steuert, ob der Ordner im Kundenkonto sichtbar ist. Jeder neu zugewiesene
  // Ordner (ob über einen Auftrag oder direkt über die Kundenseite) startet
  // unveröffentlicht, damit Zeit zum Sichten/Sortieren bleibt, bevor der
  // Kunde ihn sieht — erst der explizite "Ordner freigeben"-Klick macht ihn
  // sichtbar.
  released: boolean;
}

const clientPhotoFolderSchema = new Schema<ClientPhotoFolderDoc>(
  {
    clientId: { type: Schema.Types.ObjectId, ref: "Client", required: true, index: true },
    orderId: { type: Schema.Types.ObjectId, ref: "Order", default: null },
    nextcloudPath: { type: String, required: true },
    label: { type: String, default: "", trim: true },
    assignedAt: { type: Date, default: Date.now },
    sortOrder: { type: Number, default: 0 },
    // Kein `default: null` — ein explizit gespeicherter Null-Wert würde vom
    // sparse-Index trotzdem indexiert (sparse überspringt nur wirklich
    // FEHLENDE Felder), sodass ab dem zweiten Ordner ohne Teilen-Link ein
    // E11000-Duplicate-Key-Fehler auftrat. Ohne Default bleibt das Feld bei
    // fehlendem Wert komplett unset.
    shareToken: { type: String, index: true, sparse: true, unique: true },
    shareTokenExpiresAt: { type: Date, default: null },
    released: { type: Boolean, default: false },
  },
  { timestamps: true }
);

export const ClientPhotoFolder =
  (models.ClientPhotoFolder as mongoose.Model<ClientPhotoFolderDoc>) ||
  model<ClientPhotoFolderDoc>("ClientPhotoFolder", clientPhotoFolderSchema);
