import mongoose, { Schema, models, model } from "mongoose";
import { SHOOTING_TYPES, type ShootingType, SERVICE_STATUSES, type ServiceStatus } from "@/lib/orderConstants";

export { SERVICE_STATUSES };
export type { ServiceStatus };

export interface AddOnDoc {
  label: string;
  labelEn: string;
  priceSurcharge: number;
}

export interface PriceTierDoc {
  _id: string;
  name: string;
  nameEn: string;
  price: number;
  // Optionale Zusatzoptionen mit Preisaufschlag (z. B. "Express-Bearbeitung
  // +50 €") — rein informativ wie der Preis selbst, keine bindende Zusage,
  // da der echte Endpreis über die Preisverhandlung läuft.
  addOns: AddOnDoc[];
  // "ab X €" (Startpreis, hängt vom Aufwand ab) statt Festpreis — Standard in
  // der Fotografie, da der echte Preis erst über die bestehende
  // Preisverhandlung (PriceProposal) verbindlich vereinbart wird. Diese
  // Preisstufen sind eine Orientierung/Startpunkt, keine bindende Zusage.
  priceFrom: boolean;
  deliverables: string;
  deliverablesEn: string;
  active: boolean;
  sortOrder: number;
  // Zeitlich begrenzter Aktionspreis — wenn gesetzt und das heutige Datum im
  // Zeitraum liegt, wird promoPrice statt price angezeigt (durchgestrichener
  // Normalpreis daneben). Rein informativ wie der Preis selbst.
  promoPrice: number | null;
  promoLabel: string;
  promoFrom: Date | null;
  promoUntil: Date | null;
}

export interface ServiceDoc {
  _id: string;
  title: string;
  titleEn: string;
  description: string;
  descriptionEn: string;
  status: ServiceStatus;
  shootingType: ShootingType;
  sortOrder: number;
  tiers: PriceTierDoc[];
  createdAt: Date;
}

const addOnSchema = new Schema<AddOnDoc>(
  {
    label: { type: String, required: true, trim: true, maxlength: 100 },
    labelEn: { type: String, default: "", trim: true, maxlength: 100 },
    priceSurcharge: { type: Number, required: true, min: 0 },
  },
  { _id: false }
);

const priceTierSchema = new Schema<PriceTierDoc>(
  {
    name: { type: String, required: true, trim: true, maxlength: 100 },
    nameEn: { type: String, default: "", trim: true, maxlength: 100 },
    price: { type: Number, required: true, min: 0 },
    addOns: { type: [addOnSchema], default: [] },
    priceFrom: { type: Boolean, default: true },
    deliverables: { type: String, default: "", trim: true, maxlength: 500 },
    deliverablesEn: { type: String, default: "", trim: true, maxlength: 500 },
    active: { type: Boolean, default: true },
    sortOrder: { type: Number, default: 0 },
    promoPrice: { type: Number, default: null, min: 0 },
    promoLabel: { type: String, default: "", trim: true, maxlength: 100 },
    promoFrom: { type: Date, default: null },
    promoUntil: { type: Date, default: null },
  },
  { timestamps: true }
);

const serviceSchema = new Schema<ServiceDoc>(
  {
    title: { type: String, required: true, trim: true },
    titleEn: { type: String, default: "", trim: true },
    description: { type: String, default: "", trim: true },
    descriptionEn: { type: String, default: "", trim: true },
    status: { type: String, enum: SERVICE_STATUSES, default: "available" },
    shootingType: { type: String, enum: SHOOTING_TYPES, default: "Other" },
    sortOrder: { type: Number, default: 0 },
    tiers: { type: [priceTierSchema], default: [] },
  },
  { timestamps: true }
);

export const Service =
  (models.Service as mongoose.Model<ServiceDoc>) || model<ServiceDoc>("Service", serviceSchema);
