import { cache } from "react";
import { connectDB } from "./db";
import { Settings, type SettingsDoc } from "@/models/Settings";

// Einziges Settings-Dokument der App (key: "main"), analog zum V1-Muster.
// Wird angelegt, falls noch nicht vorhanden, damit die Seite nie ohne
// Settings-Objekt dasteht.
const DEFAULT_INVOICE_SETTINGS: SettingsDoc["invoiceSettings"] = {
  businessName: "Rakku Photography",
  legalName: "",
  street: "",
  postCode: "",
  city: "",
  countryCode: "DE",
  email: "",
  taxId: "",
  kleinunternehmer: true,
  vatRate: 19,
  iban: "",
  bic: "",
  bankName: "",
  accountHolderName: "",
  invoiceNumberPrefix: "RG-",
  nextInvoiceNumber: 1,
};

const DEFAULT_PAYMENT_SETTINGS: SettingsDoc["paymentSettings"] = {
  enabled: false,
};

const DEFAULT_BANNER_SETTINGS: SettingsDoc["bannerSettings"] = {
  enabled: false,
  text: "",
  textEn: "",
};

const DEFAULT_VOUCHER_SETTINGS: SettingsDoc["voucherSettings"] = {
  enabled: true,
};

const DEFAULT_SEO_SETTINGS: SettingsDoc["seoSettings"] = {
  metaTitleSuffix: " · Rakku Photography",
  defaultMetaDescription: "",
  defaultMetaDescriptionEn: "",
  keywords: "",
  keywordsEn: "",
  ogImage: "",
  googleSiteVerification: "",
  bingSiteVerification: "",
  googleAnalyticsId: "",
  businessPhone: "",
  priceRange: "",
  openingHours: "",
  indexable: true,
};

const DEFAULT_REFERRAL_SETTINGS: SettingsDoc["referralSettings"] = {
  enabled: true,
  refereeDiscountType: "percent",
  refereeDiscountValue: 10,
  referrerRewardType: "percent",
  referrerRewardValue: 10,
};

const DEFAULT_REENGAGEMENT_SETTINGS: SettingsDoc["reengagementSettings"] = {
  enabled: true,
  delayDays: 365,
  customText: "",
  customTextEn: "",
};

const DEFAULT_PRESHOOT_REMINDER_SETTINGS: SettingsDoc["preshootReminderSettings"] = {
  enabled: true,
  hoursBefore: 48,
  customText: "",
  customTextEn: "",
};

const DEFAULT_FEEDBACK_REQUEST_SETTINGS: SettingsDoc["feedbackRequestSettings"] = {
  enabled: true,
  delayDays: 5,
};

const DEFAULT_WEATHER_CHECK_SETTINGS: SettingsDoc["weatherCheckSettings"] = {
  enabled: true,
  hoursBefore: 48,
};

const DEFAULT_REVIEW_REWARD_SETTINGS: SettingsDoc["reviewRewardSettings"] = {
  enabled: true,
  type: "fixed",
  value: 5,
};

const DEFAULT_LOYALTY_SETTINGS: SettingsDoc["loyaltySettings"] = {
  enabled: true,
  ordersThreshold: 3,
  rewardType: "percent",
  rewardValue: 10,
};

const DEFAULT_TAX_RESERVE_SETTINGS: SettingsDoc["taxReserveSettings"] = {
  percentage: 28,
};

const DEFAULT_MILEAGE_SETTINGS: SettingsDoc["mileageSettings"] = {
  ratePerKm: 0.3,
};

const DEFAULT_REMINDER_ESCALATION_SETTINGS: SettingsDoc["reminderEscalationSettings"] = {
  autoEnabled: false,
  daysUntilFirstReminder: 14,
  daysBetweenLevels: 10,
  levelFees: [0, 5, 15],
};

const DEFAULT_BOOKING_SETTINGS: SettingsDoc["bookingSettings"] = {
  minLeadTimeWeeks: 2,
};

const DEFAULT_GOOGLE_SYNC_SETTINGS: SettingsDoc["googleSyncSettings"] = {
  reflectDeletionsFromGoogle: false,
};

const DEFAULT_GOOGLE_REVIEW_SETTINGS: SettingsDoc["googleReviewSettings"] = {
  url: "",
};

// Pro Request memoisiert (React cache) — Layout und Seite rufen getSettings()
// mehrfach auf (generateMetadata + Render, plus Footer/Header), das war vorher
// jedes Mal eine eigene DB-Operation. Zusätzlich: erst ein günstiger
// findOne-Point-Query auf dem eindeutigen key; das (einmalige) Anlegen per
// Upsert nur, falls das Dokument wirklich fehlt — statt bei JEDEM Aufruf über
// den Schreibpfad zu gehen.
export const getSettings = cache(async (): Promise<SettingsDoc> => {
  await connectDB();
  const doc =
    (await Settings.findOne({ key: "main" }).lean()) ??
    (await Settings.findOneAndUpdate(
      { key: "main" },
      { $setOnInsert: { key: "main" } },
      { upsert: true, returnDocument: "after" }
    ).lean());
  const settings = doc as unknown as SettingsDoc;
  // Doc existierte schon, bevor diese Felder zum Schema hinzukamen —
  // $setOnInsert greift nur bei Neuanlage, nicht bei bestehenden Docs.
  if (!settings.invoiceSettings) settings.invoiceSettings = DEFAULT_INVOICE_SETTINGS;
  if (!settings.paymentSettings) settings.paymentSettings = DEFAULT_PAYMENT_SETTINGS;
  if (!settings.seoSettings) settings.seoSettings = DEFAULT_SEO_SETTINGS;
  if (!settings.bannerSettings) settings.bannerSettings = DEFAULT_BANNER_SETTINGS;
  if (!settings.voucherSettings) settings.voucherSettings = DEFAULT_VOUCHER_SETTINGS;
  if (!settings.referralSettings) settings.referralSettings = DEFAULT_REFERRAL_SETTINGS;
  if (!settings.reengagementSettings) settings.reengagementSettings = DEFAULT_REENGAGEMENT_SETTINGS;
  if (!settings.preshootReminderSettings) settings.preshootReminderSettings = DEFAULT_PRESHOOT_REMINDER_SETTINGS;
  if (!settings.weatherCheckSettings) settings.weatherCheckSettings = DEFAULT_WEATHER_CHECK_SETTINGS;
  if (!settings.reviewRewardSettings) settings.reviewRewardSettings = DEFAULT_REVIEW_REWARD_SETTINGS;
  if (!settings.loyaltySettings) settings.loyaltySettings = DEFAULT_LOYALTY_SETTINGS;
  if (!settings.feedbackRequestSettings) settings.feedbackRequestSettings = DEFAULT_FEEDBACK_REQUEST_SETTINGS;
  if (!settings.taxReserveSettings) settings.taxReserveSettings = DEFAULT_TAX_RESERVE_SETTINGS;
  if (!settings.mileageSettings) settings.mileageSettings = DEFAULT_MILEAGE_SETTINGS;
  if (!settings.reminderEscalationSettings) settings.reminderEscalationSettings = DEFAULT_REMINDER_ESCALATION_SETTINGS;
  if (!settings.bookingSettings) settings.bookingSettings = DEFAULT_BOOKING_SETTINGS;
  if (!settings.googleSyncSettings) settings.googleSyncSettings = DEFAULT_GOOGLE_SYNC_SETTINGS;
  if (!settings.googleReviewSettings) settings.googleReviewSettings = DEFAULT_GOOGLE_REVIEW_SETTINGS;
  return settings;
});
