/** سرویس سفارش‌ها (خواندن از دیتابیس) */
import "server-only";
import { db } from "@/lib/db";
import type { OrderStatus as DbOrderStatus, Prisma } from "@/generated/prisma/client";
import type { OrderStatus, SampleOrder } from "@/data/orders";
import { getVariantsForCart } from "./catalog";

/** نمای سفارش برای صفحات پروفایل و پیگیری */
export type OrderView = SampleOrder;

const include = { items: true, history: { orderBy: { createdAt: "asc" } }, shippingMethod: true } satisfies Prisma.OrderInclude;
type OrderRow = Prisma.OrderGetPayload<{ include: typeof include }>;

const toStatus = (s: DbOrderStatus) => s.toLowerCase() as OrderStatus;

async function toView(o: OrderRow) {
  const found = await getVariantsForCart(o.items.map((i) => i.variantId));
  const order: OrderView = {
    code: o.code,
    phone: o.phone,
    status: toStatus(o.status),
    createdAt: o.createdAt.toISOString(),
    shippingMethod: o.shippingMethod.name,
    trackingCode: o.trackingCode ?? undefined,
    items: o.items.map((i) => ({ productId: 0, variantId: i.variantId, qty: i.qty, price: i.price })),
    shippingCost: o.shippingCost,
    discount: o.discount,
    history: o.history.map((h) => ({ status: toStatus(h.status), at: h.createdAt.toISOString() })),
  };
  const items = o.items.flatMap((i) => {
    const f = found.find((x) => x.variant.id === i.variantId);
    return f ? [{ ...f, qty: i.qty }] : [];
  });
  return { order, items };
}

/** سفارش‌های یک کاربر بر اساس موبایل (در مرحله ۳ از نشست سرور خوانده می‌شود) */
export async function getOrdersByPhone(phone: string) {
  const rows = await db.order.findMany({ where: { user: { phone }, status: { not: "PENDING_PAYMENT" } }, include, orderBy: { createdAt: "desc" } });
  return Promise.all(rows.map(toView));
}

/** پیگیری سفارش با شماره سفارش + موبایل (هر دو باید درست باشند) */
export async function trackOrder(code: string, phone: string) {
  const row = await db.order.findFirst({ where: { code: code.toUpperCase(), OR: [{ phone }, { user: { phone } }] }, include });
  return row ? toView(row) : undefined;
}
