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

export type CalendarKind = "orders" | "absences" | "conventions" | "custom";
export type CalendarVisibility = "private" | "team";

export interface CalendarDoc {
  _id: string;
  name: string;
  color: string;
  // "orders" = automatisch generierte Systemansicht aus Order.shootDate,
  // "absences" = automatisch generierte Systemansicht aus Absence
  // (Urlaub/Krankheit), "conventions" = automatisch generierte Systemansicht
  // aus Conventions mit "Team vor Ort" (assignedStaffIds) — jeweils genau ein
  // Dokument, nicht löschbar, nicht manuell editierbar. "custom" = von
  // Mitarbeitern selbst angelegte Kalender.
  kind: CalendarKind;
  ownerId: mongoose.Types.ObjectId | null;
  // Markiert den automatisch angelegten persönlichen "Meine Termine"-Kalender
  // eines Mitarbeiters — damit man ihn beim Upsert wiederfindet, auch wenn er
  // umbenannt wurde. Genau einer pro Person.
  isPersonalDefault: boolean;
  visibility: CalendarVisibility;
  sharedWith: mongoose.Types.ObjectId[];
  // Zeigt anstehende/laufende Termine dieses Kalenders öffentlich auf der
  // Angebote-Seite an (z. B. "Urlaub vom X bis Y") — unabhängig von
  // `visibility`, die nur die interne Team-Sichtbarkeit steuert.
  publicVisible: boolean;
  // Geheimes Token für die abonnierbare ICS-Feed-URL — kein Login nötig
  // (Google/Apple/Outlook rufen die URL anonym ab), daher regenerierbar
  // falls versehentlich weitergegeben.
  icsToken: string;
  // Einseitige Push-Sync zu Google Calendar (unsere Termine → Google, nicht
  // umgekehrt) — Tokens gehören zu der Person, die "Mit Google verbinden"
  // geklickt hat, nicht zwingend dem Kalender-Ersteller.
  googleConnectedBy: mongoose.Types.ObjectId | null;
  googleAccessToken: string;
  googleRefreshToken: string;
  googleTokenExpiry: Date | null;
  googleCalendarId: string;
  createdAt: Date;
}

const calendarSchema = new Schema<CalendarDoc>(
  {
    name: { type: String, required: true, trim: true, maxlength: 100 },
    color: { type: String, default: "#38bdf8" },
    kind: { type: String, enum: ["orders", "absences", "conventions", "custom"], default: "custom" },
    ownerId: { type: Schema.Types.ObjectId, ref: "Client", default: null },
    isPersonalDefault: { type: Boolean, default: false },
    visibility: { type: String, enum: ["private", "team"], default: "private" },
    sharedWith: { type: [Schema.Types.ObjectId], ref: "Client", default: [] },
    publicVisible: { type: Boolean, default: false },
    icsToken: { type: String, required: true },
    googleConnectedBy: { type: Schema.Types.ObjectId, ref: "Client", default: null },
    googleAccessToken: { type: String, default: "" },
    googleRefreshToken: { type: String, default: "" },
    googleTokenExpiry: { type: Date, default: null },
    googleCalendarId: { type: String, default: "primary" },
  },
  { timestamps: true }
);

export const Calendar =
  (models.Calendar as mongoose.Model<CalendarDoc>) || model<CalendarDoc>("Calendar", calendarSchema);
