// Getrennt von models/Order.ts, damit Client-Komponenten diese Konstanten
// importieren können, ohne Mongoose (Node-only) in den Browser-Bundle zu ziehen.
export const SHOOTING_TYPES = ["Convention", "Outdoor", "Portrait", "Character-focused", "Other"] as const;
export type ShootingType = (typeof SHOOTING_TYPES)[number];

export const ORDER_TAGS = [
  "shoot_new_request",
  "shoot_waiting_for_date",
  "shoot_scheduled",
  "shoot_completed",
  "edit_review_photos",
  "edit_select_final",
  "edit_editing",
  "edit_final_check",
  "edit_wait_for_feedback",
  "edit_apply_changes",
  "done_phase1",
  "done_posted",
  "done_dropped",
] as const;
export type OrderTag = (typeof ORDER_TAGS)[number];

export const ORDER_TAG_LABELS: Record<OrderTag, string> = {
  shoot_new_request: "Shoot · Neue Anfrage",
  shoot_waiting_for_date: "Shoot · Warten auf Termin",
  shoot_scheduled: "Shoot · Termin geplant",
  shoot_completed: "Shoot · Abgeschlossen",
  edit_review_photos: "Edit · Fotos sichten",
  edit_select_final: "Edit · Finale Auswahl",
  edit_editing: "Edit · Bearbeitung läuft",
  edit_final_check: "Edit · Finale Prüfung",
  edit_wait_for_feedback: "Edit · Warten auf Feedback",
  edit_apply_changes: "Edit · Änderungen umsetzen",
  done_phase1: "Done · Phase 1 abgeschlossen",
  done_posted: "Done · Veröffentlicht",
  done_dropped: "Done · Abgebrochen",
};

// Farblich nach Kanban-Phase gruppiert (Shoot/Edit/Done), Abgebrochen separat rot.
export const ORDER_TAG_COLORS: Record<OrderTag, string> = {
  shoot_new_request: "#38bdf8",
  shoot_waiting_for_date: "#38bdf8",
  shoot_scheduled: "#38bdf8",
  shoot_completed: "#38bdf8",
  edit_review_photos: "#fbbf24",
  edit_select_final: "#fbbf24",
  edit_editing: "#fbbf24",
  edit_final_check: "#fbbf24",
  edit_wait_for_feedback: "#fbbf24",
  edit_apply_changes: "#fbbf24",
  done_phase1: "#34d399",
  done_posted: "#34d399",
  done_dropped: "#f87171",
};

export const SHOOTING_TYPE_COLORS: Record<ShootingType, string> = {
  Convention: "#38bdf8",
  Outdoor: "#34d399",
  Portrait: "#fbbf24",
  "Character-focused": "#f472b6",
  Other: "#a3a1a6",
};

export const SERVICE_STATUSES = ["available", "on_request", "unavailable"] as const;
export type ServiceStatus = (typeof SERVICE_STATUSES)[number];

export const PAYMENT_METHODS = ["bank_transfer", "paypal", "online", "cash", "other"] as const;
export type PaymentMethod = (typeof PAYMENT_METHODS)[number];

export const PAYMENT_METHOD_LABELS: Record<PaymentMethod, string> = {
  bank_transfer: "Überweisung",
  paypal: "PayPal (manuell)",
  online: "Online-Zahlung",
  cash: "Bar",
  other: "Sonstiges",
};

export const ACTIVITY_TYPES = [
  "order_created",
  "tag_changed",
  "compensation_type_changed",
  "price_proposed",
  "price_accepted",
  "price_rejected",
  "price_countered",
  "contract_created",
  "contract_sent",
  "contract_reminder_sent",
  "contract_signed",
  "contract_deleted",
  "order_rejected",
  "order_unrejected",
  "order_paid",
  "order_unpaid",
  "invoice_created",
  "reminder_sent",
  "manual_discount_granted",
  "manual_discount_removed",
  "attachments_added",
  "assignee_changed",
  "order_deposit_set",
  "order_refunded",
  "credit_applied",
] as const;
export type ActivityType = (typeof ACTIVITY_TYPES)[number];

// Startpunkte für die interne Vorbereitungs-Checkliste eines Auftrags (siehe
// models/Order.ts `checklist`) — Team kann weitere eigene Punkte ergänzen
// oder diese entfernen, rein als sinnvoller Ausgangspunkt gedacht.
// Modellfreigabe/Nutzungsrechte für Fotos aus einem Auftrag (Portfolio/
// Social Media) — bei TFP-Aufträgen deckt der ausführliche TFP-Vertrag das
// längst ab (photographerUsage/publicationChannels), hier geht es um
// bezahlte Standard-Aufträge, wo das bisher nicht abgefragt wurde.
export const USAGE_RIGHTS_OPTIONS = ["", "yes", "no", "anonymized"] as const;
export type UsageRights = (typeof USAGE_RIGHTS_OPTIONS)[number];
export const USAGE_RIGHTS_LABELS: Record<UsageRights, string> = {
  "": "Noch nicht geklärt",
  yes: "Ja, Fotos dürfen fürs Portfolio/Social Media/Google-Unternehmensprofil verwendet werden",
  no: "Nein, keine Verwendung außerhalb der Lieferung an die Kundschaft",
  anonymized: "Nur anonymisiert (z. B. ohne Gesicht/Tags)",
};

export const DEFAULT_CHECKLIST_ITEMS = [
  "Vertrag unterschrieben",
  "Anzahlung/Zahlung erhalten",
  "Ausrüstung gepackt",
  "Treffpunkt bestätigt",
] as const;

export function formatEUR(amount: number): string {
  return new Intl.NumberFormat("de-DE", { style: "currency", currency: "EUR" }).format(amount);
}

// Verwendungszweck-Referenz für Überweisungen — deterministisch aus der
// Auftrags-ID abgeleitet, kein eigenes DB-Feld/keine Kollisionsprüfung nötig.
export function formatPaymentReference(orderId: string): string {
  return `RK-${orderId.slice(-8).toUpperCase()}`;
}

// order.datePeriod kommt seit Einführung des Kalender-Feldes im Anfrage-
// Formular als reines "YYYY-MM-DD" rein (siehe NewOrderForm.tsx) — ältere
// Aufträge können noch die alte freitextliche Eingabe enthalten ("Ende Mai"
// o. Ä.), die unverändert durchgereicht wird, statt einen Formatierungsfehler
// zu riskieren.
export function formatDatePeriod(value: string, locale: "de" | "en" = "de"): string {
  if (!/^\d{4}-\d{2}-\d{2}$/.test(value)) return value;
  return new Date(`${value}T00:00:00`).toLocaleDateString(locale === "en" ? "en-GB" : "de-DE", {
    day: "2-digit",
    month: "long",
    year: "numeric",
  });
}

// Zentrale Datumsformatierung — toLocaleDateString("de-DE") OHNE explizite
// Optionen füllt Tag/Monat NICHT mit einer führenden Null auf (ergibt
// "23.8.2026" statt "23.08.2026"). Diese drei Funktionen erzwingen überall
// im Projekt zweistellige Tage/Monate, statt dass jede Stelle das Options-
// Objekt einzeln (und potenziell inkonsistent) selbst mitgeben muss.
export function formatDateDE(date: Date | string): string {
  return new Date(date).toLocaleDateString("de-DE", { day: "2-digit", month: "2-digit", year: "numeric" });
}

export function formatDateTimeDE(date: Date | string): string {
  return new Date(date).toLocaleString("de-DE", {
    day: "2-digit",
    month: "2-digit",
    year: "numeric",
    hour: "2-digit",
    minute: "2-digit",
  });
}

// Für Stellen, die schon zwischen de/en umschalten (Konto-Bereich) —
// gleiches Prinzip, nur mit englischem Fallback-Locale.
export function formatDateLocale(date: Date | string, locale: string): string {
  return new Date(date).toLocaleDateString(locale === "en" ? "en-GB" : "de-DE", {
    day: "2-digit",
    month: "2-digit",
    year: "numeric",
  });
}

// Baut eine strukturierte Adresse (street/postCode/city/countryCode, wie sie
// ZUGFeRD verlangt) zu einer menschenlesbaren Anzeige zusammen.
export function formatAddress(a: { street?: string; postCode?: string; city?: string; countryCode?: string }): string {
  const lines = [a.street, [a.postCode, a.city].filter(Boolean).join(" ")].filter(Boolean);
  if (a.countryCode && a.countryCode !== "DE") lines.push(a.countryCode);
  return lines.join("\n");
}

// Genauer Treffpunkt für den Termin — wenn das Team eine strukturierte
// Adresse gesetzt hat, hat die Vorrang; sonst Rückfall auf die grobe
// Freitext-Angabe des Kunden aus der ursprünglichen Anfrage.
export function effectiveEventAddress(order: {
  eventStreet?: string;
  eventPostCode?: string;
  eventCity?: string;
  eventCountryCode?: string;
  eventLocation?: string;
}): string {
  const structured = formatAddress({
    street: order.eventStreet,
    postCode: order.eventPostCode,
    city: order.eventCity,
    countryCode: order.eventCountryCode,
  });
  return structured || order.eventLocation || "";
}
