import mongoose, { Schema, models, model } from "mongoose";
import { VACATION_REQUEST_STATUSES, type VacationRequestStatus } from "@/lib/vacationConstants";

// Eigenständig neben Absence.ts (siehe dessen Kommentar: bewusst nur ein
// Log, kein Konto mit Genehmigungs-Workflow) - Till wollte für Urlaub
// explizit ein formelleres System: Kontingent pro Mitarbeiter
// (Client.vacationDaysPerYear) + Beantragen/Genehmigen/Ablehnen
// (Personalsystem-Ergänzung, 25.09.2026).
export interface VacationRequestDoc {
  _id: string;
  clientId: mongoose.Types.ObjectId;
  startDate: Date;
  endDate: Date;
  // Bei Erstellung berechnet (siehe countVacationWorkDays) und danach
  // eingefroren, damit eine spätere Änderung an der Zähllogik bestehende
  // Anträge nicht rückwirkend verändert.
  workDaysCount: number;
  status: VacationRequestStatus;
  note: string;
  decidedByClientId: mongoose.Types.ObjectId | null;
  decidedAt: Date | null;
  rejectionReason: string;
  createdAt: Date;
}

const vacationRequestSchema = new Schema<VacationRequestDoc>(
  {
    clientId: { type: Schema.Types.ObjectId, ref: "Client", required: true, index: true },
    startDate: { type: Date, required: true },
    endDate: { type: Date, required: true },
    workDaysCount: { type: Number, required: true, min: 0 },
    status: { type: String, enum: VACATION_REQUEST_STATUSES, default: "requested" },
    note: { type: String, default: "", trim: true, maxlength: 300 },
    decidedByClientId: { type: Schema.Types.ObjectId, ref: "Client", default: null },
    decidedAt: { type: Date, default: null },
    rejectionReason: { type: String, default: "", trim: true, maxlength: 300 },
  },
  { timestamps: { createdAt: true, updatedAt: false } }
);

export const VacationRequest =
  (models.VacationRequest as mongoose.Model<VacationRequestDoc>) ||
  model<VacationRequestDoc>("VacationRequest", vacationRequestSchema);
