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

// Getrennt von PhotoRating.ts, weil dort Kunden-gesetzte Werte liegen
// (stars/note/collection) - Tags werden dagegen von Staff in der
// Admin-Freigabe-Ansicht gesetzt (Foto-Tags-Feature, 26.09.2026), und die
// Pixelmaße sind reine, technisch ermittelte Fakten (aus Nextcloud gelesen,
// einmalig gecacht statt bei jedem Seitenaufruf neu berechnet). Gleiches
// (folderId, fileName)-Schlüsselmuster wie PhotoRating.
export interface PhotoMetadataDoc {
  _id: string;
  clientId: mongoose.Types.ObjectId;
  folderId: mongoose.Types.ObjectId;
  fileName: string;
  // Von Staff vergeben, pro Ordner ein eigener, sich frei entwickelnder
  // Tag-Vorrat (keine feste sitebreite Liste) - siehe getFolderTagSuggestions
  // in lib/photoFormat.ts.
  tags: string[];
  // Pixelmaße aus der Originaldatei (sharp), einmalig ermittelt und gecacht -
  // Grundlage für die automatische Druckformat-Anzeige, siehe lib/photoFormat.ts.
  widthPx: number | null;
  heightPx: number | null;
  createdAt: Date;
}

const photoMetadataSchema = new Schema<PhotoMetadataDoc>(
  {
    clientId: { type: Schema.Types.ObjectId, ref: "Client", required: true, index: true },
    folderId: { type: Schema.Types.ObjectId, ref: "ClientPhotoFolder", required: true, index: true },
    fileName: { type: String, required: true },
    tags: { type: [String], default: [] },
    widthPx: { type: Number, default: null },
    heightPx: { type: Number, default: null },
  },
  { timestamps: true }
);

photoMetadataSchema.index({ folderId: 1, fileName: 1 }, { unique: true });

export const PhotoMetadata =
  (models.PhotoMetadata as mongoose.Model<PhotoMetadataDoc>) ||
  model<PhotoMetadataDoc>("PhotoMetadata", photoMetadataSchema);
