import { connectDB } from "@/lib/db";
import { DiscountCode } from "@/models/DiscountCode";
import { Client } from "@/models/Client";
import { Convention } from "@/models/Convention";

export async function getDiscountCodes() {
  await connectDB();
  const items = await DiscountCode.find({}).sort({ createdAt: -1 }).lean();
  const ownerIds = items.map((i) => i.ownerId).filter(Boolean).map((id) => String(id));
  const owners = ownerIds.length ? await Client.find({ _id: { $in: ownerIds } }).select("name").lean() : [];
  const ownerNameById = new Map(owners.map((o) => [String(o._id), o.name]));

  const conventionIds = items.map((i) => i.conventionId).filter(Boolean).map((id) => String(id));
  const conventions = conventionIds.length ? await Convention.find({ _id: { $in: conventionIds } }).select("name").lean() : [];
  const conventionNameById = new Map(conventions.map((c) => [String(c._id), c.name]));

  return items.map((item) => ({
    _id: String(item._id),
    code: item.code,
    type: item.type,
    value: item.value,
    maxUses: item.maxUses,
    usedCount: item.usedCount,
    validUntil: item.validUntil ? new Date(item.validUntil).toISOString() : null,
    stammkundenOnly: item.stammkundenOnly,
    neukundenOnly: item.neukundenOnly,
    active: item.active,
    note: item.note,
    ownerName: item.ownerId ? ownerNameById.get(String(item.ownerId)) || "" : "",
    conventionId: item.conventionId ? String(item.conventionId) : null,
    conventionName: item.conventionId ? conventionNameById.get(String(item.conventionId)) || "" : "",
  }));
}
