/**
 * داده نمونه نظرات کاربران.
 * برای هر محصول به‌صورت قطعی (با seed ثابت) چند نظر از مجموعه متن‌های نمونه ساخته می‌شود
 * تا در هر بار اجرا نتیجه یکسان باشد.
 */
import type { Review } from "@/types/catalog";

type Pool = { rating: number; title: string; body: string }[];

const pools: Record<"skin" | "makeup" | "fragrance" | "care", Pool> = {
  skin: [
    { rating: 5, title: "بافت سبک و جذب سریع", body: "روی پوستم اصلاً چسبندگی نداره و زیر آرایش هم خوب می‌شینه. بعد از دو هفته پوستم یکدست‌تر شده." },
    { rating: 5, title: "دوباره می‌خرم", body: "بسته‌بندی تمیز و رایحه خیلی ملایم. پوست حساسم هیچ واکنشی نشون نداد." },
    { rating: 4, title: "خوبه ولی صبر لازم داره", body: "نتیجه‌اش تدریجیه. از هفته سوم تفاوت رو حس کردم. قیمتش کمی بالاست." },
    { rating: 4, title: "مناسب پوست مختلط", body: "ناحیه T رو براق نمی‌کنه و گونه‌هام هم خشک نمی‌شن. برای تابستون عالیه." },
    { rating: 3, title: "معمولی", body: "بد نبود ولی انتظار بیشتری داشتم. برای پوست خیلی خشک کافی نیست." },
    { rating: 5, title: "از بهترین خریدهام", body: "صبح‌ها قبل از ضدآفتاب استفاده می‌کنم و پوستم شاداب‌تر به نظر می‌رسه. ارسال هم سریع بود." },
    { rating: 4, title: "رایحه خوب، نتیجه خوب", body: "مقدار کمی کافیه و ماندگاری بسته خوبه. فقط کاش درپوشش محکم‌تر بود." },
  ],
  makeup: [
    { rating: 5, title: "رنگ دقیقاً مثل تصویر", body: "پیگمنتش عالیه و با یک بار کشیدن رنگ کامل میده. تا آخر روز ماند." },
    { rating: 4, title: "ماندگاری خوب", body: "بعد از ناهار کمی تمدید لازم داشت ولی خشک نمی‌کنه. رنگش خیلی شیکه." },
    { rating: 5, title: "بافت مخملی", body: "روی پوست سنگینی نمی‌کنه و طبیعی دیده میشه. توی عکس‌ها هم عالی بود." },
    { rating: 3, title: "برای من کمی تیره بود", body: "کیفیتش خوبه ولی بهتره قبل از خرید راهنمای رنگ رو دقیق ببینید." },
    { rating: 4, title: "ارزش خرید داره", body: "بسته‌بندی لوکس و جمع‌وجوره، توی کیف جا میشه. کیفیت نسبت به قیمت مناسبه." },
    { rating: 5, title: "عاشقش شدم", body: "از صبح تا شب بدون ریزش ماند و پاک کردنش هم راحت بود." },
  ],
  fragrance: [
    { rating: 5, title: "رایحه خاص و ماندگار", body: "تا شب روی لباس می‌مونه. نت‌های اولیه کمی تند هستن ولی بعد از نیم ساعت فوق‌العاده میشه." },
    { rating: 4, title: "مناسب پاییز", body: "گرم و دلنشینه. پخش بوی متوسطی داره، برای محل کار مناسبه." },
    { rating: 5, title: "هدیه عالی", body: "برای هدیه گرفتم و بسته‌بندیش خیلی شیک بود. خیلی تعریف شنیدم." },
    { rating: 3, title: "سلیقه‌ای", body: "برای من کمی شیرین بود ولی کیفیتش قابل قبوله." },
  ],
  care: [
    { rating: 5, title: "نرمی محسوس", body: "از همون استفاده اول نرمی رو حس کردم. رایحه‌اش ملایم و تمیزه." },
    { rating: 4, title: "مصرف اقتصادی", body: "مقدار کم کافیه و حجمش زیاده. تا الان راضی بودم." },
    { rating: 4, title: "خوب برای موهای رنگ‌شده", body: "موهام وز کمتری داره و براق‌تر شده. فقط کمی دیر آبکشی میشه." },
    { rating: 5, title: "همیشه توی حمامم هست", body: "پوستم بعدش اصلاً کشیده نمیشه. بوی بادومش آرامش‌بخشه." },
  ],
};

const authors = ["سارا م.", "نگار ک.", "مریم ر.", "الهام ج.", "پریسا ت.", "زهره ن.", "آیدا ب.", "شیما ص.", "رها ا.", "فاطمه ق.", "کیانا د.", "مهسا ح."];
const skinIds = ["dry", "oily", "combination", "normal", "sensitive"];

/** مولد عدد شبه‌تصادفی با seed ثابت (mulberry32) */
function seeded(seed: number) {
  return () => {
    seed |= 0;
    seed = (seed + 0x6d2b79f5) | 0;
    let t = Math.imul(seed ^ (seed >>> 15), 1 | seed);
    t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
    return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
  };
}

/** ساخت نظرات نمونه برای یک محصول */
export function buildReviews(productId: number, pool: keyof typeof pools): Review[] {
  const rand = seeded(productId * 7919);
  const source = pools[pool];
  const count = 3 + Math.floor(rand() * 6);
  const base = Date.parse("2026-10-20T10:00:00Z");
  return Array.from({ length: count }, (_, i) => {
    const item = source[Math.floor(rand() * source.length)];
    return {
      id: `r-${productId}-${i + 1}`,
      productId,
      author: authors[Math.floor(rand() * authors.length)],
      rating: item.rating,
      title: item.title,
      body: item.body,
      createdAt: new Date(base - Math.floor(rand() * 120) * 86_400_000).toISOString(),
      verifiedPurchase: rand() > 0.25,
      skinTypeId: pool === "skin" || pool === "makeup" ? skinIds[Math.floor(rand() * skinIds.length)] : undefined,
    };
  }).sort((a, b) => b.createdAt.localeCompare(a.createdAt));
}
