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

// Zeiterfassung (Personalsystem, 24.09.2026) — bewusst einzelne Ein-/Ausstempel-
// Zeitstempel statt nur einer Tagessumme, damit sich später (falls gewünscht)
// echte Pausen-/Höchstarbeitszeit-Prüfung nach ArbZG draufsetzen lässt, ohne
// die Datenstruktur nochmal umbauen zu müssen. Das hier ist ausdrücklich NICHT
// bereits eine rechtssichere, arbeitsrechtskonforme Zeiterfassung — nur eine
// ehrliche Zeitstempel-Basis dafür (siehe Rückmeldung an den Nutzer, 24.09.2026).
export interface TimeEntryDoc {
  _id: string;
  clientId: mongoose.Types.ObjectId;
  clockIn: Date;
  // null = aktuell eingestempelt (läuft noch) - genau EIN offener Eintrag pro
  // Mitarbeiter gleichzeitig, siehe unique-Teilindex unten.
  clockOut: Date | null;
  note: string;
  createdAt: Date;
}

const timeEntrySchema = new Schema<TimeEntryDoc>(
  {
    clientId: { type: Schema.Types.ObjectId, ref: "Client", required: true, index: true },
    clockIn: { type: Date, required: true },
    clockOut: { type: Date, default: null },
    note: { type: String, default: "", trim: true, maxlength: 200 },
  },
  { timestamps: { createdAt: true, updatedAt: false } }
);

// Verhindert auf DB-Ebene, dass ein Mitarbeiter (z. B. durch einen
// Doppelklick oder zwei offene Tabs) gleichzeitig zwei offene Einträge hat —
// der partielle Index greift nur für Dokumente, bei denen clockOut wirklich
// null ist.
timeEntrySchema.index({ clientId: 1, clockOut: 1 }, { unique: true, partialFilterExpression: { clockOut: null } });

export const TimeEntry =
  (models.TimeEntry as mongoose.Model<TimeEntryDoc>) || model<TimeEntryDoc>("TimeEntry", timeEntrySchema);
