// ── Mock Persian data for Rubika CRM ──────────────────────────
// Exposed on window for use across babel script files.

// پوشش fetch: توکن ورود را خودکار به همه‌ی درخواست‌های /api اضافه می‌کند
(function () {
  const _fetch = window.fetch.bind(window);
  window.fetch = (url, opts) => {
    opts = opts || {};
    const t = localStorage.getItem('crm_token');
    if (t && typeof url === 'string' && url.indexOf('/api') === 0 && url.indexOf('/api/auth') !== 0) {
      opts.headers = Object.assign({}, opts.headers, { Authorization: 'Bearer ' + t });
    }
    return _fetch(url, opts);
  };
})();

const FA_DIGITS = ['۰','۱','۲','۳','۴','۵','۶','۷','۸','۹'];
function fa(n) {
  return String(n).replace(/[0-9]/g, d => FA_DIGITS[+d]);
}
// thousands separator + persian digits, for money
function faMoney(n) {
  return fa(String(n).replace(/\B(?=(\d{3})+(?!\d))/g, '٬'));
}

// ── Businesses (multi-business owner) ─────────────────────────
const BUSINESSES = [
  { id: 'avin',   name: 'فروشگاه آوین',  kind: 'فروشگاه آنلاین', mono: 'آ', channel: '@avin_shop',  members: 24560 },
  { id: 'parsa',  name: 'آموزشگاه پارسا', kind: 'آموزش آنلاین',   mono: 'پ', channel: '@parsa_edu',  members: 8120 },
  { id: 'toranj', name: 'رستوران ترنج',   kind: 'رستوران',        mono: 'ت', channel: '@toranj_food', members: 3940 },
];

// ── Dashboard KPIs (per overview period: day / week / month / year) ──
const KPIS_BY_PERIOD = {
  day: [
    { id: 'new',  label: 'مشتری جدید امروز', value: 24,    unit: '',      delta: +12, spark: [8,11,9,14,12,18,24] },
    { id: 'open', label: 'مکالمه‌ی باز',     value: 18,    unit: '',      delta: -3,  spark: [22,20,25,19,21,20,18] },
    { id: 'rate', label: 'نرخ پاسخ‌دهی',     value: 94,    unit: '٪',     delta: +2,  spark: [88,90,89,92,91,93,94] },
    { id: 'time', label: 'میانگین زمان پاسخ', value: '۳:۲۰', unit: 'دقیقه', delta: -8,  spark: [5,4.5,4,3.8,3.5,3.6,3.3] },
  ],
  week: [
    { id: 'new',  label: 'مشتری جدید هفته',   value: 176,   unit: '',      delta: +9,  spark: [120,140,135,150,160,170,176] },
    { id: 'open', label: 'مکالمه‌ی باز',     value: 58,    unit: '',      delta: -5,  spark: [70,66,68,63,60,61,58] },
    { id: 'rate', label: 'نرخ پاسخ‌دهی',     value: 92,    unit: '٪',     delta: +1,  spark: [89,90,91,90,92,91,92] },
    { id: 'time', label: 'میانگین زمان پاسخ', value: '۳:۴۵', unit: 'دقیقه', delta: -4,  spark: [4.2,4,4.1,3.9,3.8,3.9,3.75] },
  ],
  month: [
    { id: 'new',  label: 'مشتری جدید ماه',    value: 720,   unit: '',      delta: +14, spark: [520,580,600,640,680,700,720] },
    { id: 'open', label: 'مکالمه‌ی باز',     value: 64,    unit: '',      delta: +6,  spark: [48,52,55,58,60,62,64] },
    { id: 'rate', label: 'نرخ پاسخ‌دهی',     value: 90,    unit: '٪',     delta: -2,  spark: [93,92,91,90,91,90,90] },
    { id: 'time', label: 'میانگین زمان پاسخ', value: '۴:۱۰', unit: 'دقیقه', delta: +5,  spark: [3.6,3.8,3.9,4,4.1,4.05,4.16] },
  ],
  year: [
    { id: 'new',  label: 'مشتری جدید امسال',  value: 8420,  unit: '',      delta: +22, spark: [5200,6000,6500,7100,7800,8100,8420] },
    { id: 'open', label: 'مکالمه‌ی باز',     value: 72,    unit: '',      delta: +8,  spark: [58,61,64,66,68,70,72] },
    { id: 'rate', label: 'نرخ پاسخ‌دهی',     value: 91,    unit: '٪',     delta: +3,  spark: [86,87,88,89,90,90,91] },
    { id: 'time', label: 'میانگین زمان پاسخ', value: '۳:۵۵', unit: 'دقیقه', delta: -6,  spark: [4.5,4.3,4.2,4.1,4,3.95,3.9] },
  ],
};
const KPIS = KPIS_BY_PERIOD.day;

// 7-day activity (new conversations per day) — labels are weekday
const ACTIVITY = [
  { day: 'شنبه',     v: 42 },
  { day: 'یک‌شنبه',  v: 51 },
  { day: 'دوشنبه',   v: 38 },
  { day: 'سه‌شنبه',  v: 64 },
  { day: 'چهارشنبه', v: 49 },
  { day: 'پنج‌شنبه', v: 73 },
  { day: 'جمعه',     v: 58 },
];

// peak hours heat (0-100 intensity) for a representative day — full 24h (۰..۲۳)
const PEAK_HOURS = [
  {h: 0, v: 8},{h: 1, v: 4},{h: 2, v: 2},{h: 3, v: 2},{h: 4, v: 3},{h: 5, v: 5},
  {h: 6, v: 9},{h: 7, v: 14},{h: 8, v: 22},{h: 9, v: 36},{h: 10, v: 50},{h: 11, v: 63},
  {h: 12, v: 74},{h: 13, v: 52},{h: 14, v: 40},{h: 15, v: 55},{h: 16, v: 70},{h: 17, v: 88},
  {h: 18, v: 100},{h: 19, v: 92},{h: 20, v: 96},{h: 21, v: 78},{h: 22, v: 54},{h: 23, v: 30},
];

// Sales funnel stages
const FUNNEL = [
  { stage: 'تماس اول',  count: 1240, color: 0 },
  { stage: 'علاقه‌مند', count: 820,  color: 1 },
  { stage: 'مذاکره',    count: 430,  color: 2 },
  { stage: 'خرید',      count: 268,  color: 3 },
];

// ── Customers ─────────────────────────────────────────────────
// score 0..100, value in toman, stage index matches funnel
const CUSTOMERS = [
  { id: 'c1',  name: 'مریم رضایی',    mono: 'م', tags: ['VIP','خریدار وفادار'], score: 92, value: 14800000, stage: 3, since: '۱۴۰۲', convs: 31, last: 'چند دقیقه پیش', city: 'تهران', phone: '۰۹۱۲ ۳۴۵ ۶۷۸۹' },
  { id: 'c2',  name: 'علی محمدی',     mono: 'ع', tags: ['بالقوه'],            score: 64, value: 0,        stage: 1, since: '۱۴۰۴', convs: 4,  last: '۲۰ دقیقه پیش', city: 'اصفهان', phone: '۰۹۱۳ ۲۲۱ ۴۵۶۷' },
  { id: 'c3',  name: 'فاطمه کریمی',   mono: 'ف', tags: ['VIP'],               score: 88, value: 9200000,  stage: 3, since: '۱۴۰۳', convs: 22, last: '۱ ساعت پیش', city: 'شیراز', phone: '۰۹۱۷ ۸۸۸ ۱۲۳۴' },
  { id: 'c4',  name: 'حسین نوری',     mono: 'ح', tags: ['در مذاکره'],         score: 71, value: 0,        stage: 2, since: '۱۴۰۴', convs: 9,  last: '۳ ساعت پیش', city: 'مشهد', phone: '۰۹۱۵ ۴۴۳ ۹۸۷۶' },
  { id: 'c5',  name: 'زهرا اکبری',    mono: 'ز', tags: ['خریدار اول'],        score: 58, value: 1250000,  stage: 3, since: '۱۴۰۴', convs: 6,  last: 'دیروز', city: 'تبریز', phone: '۰۹۱۴ ۱۱۲ ۳۳۴۵' },
  { id: 'c6',  name: 'محمد حسینی',    mono: 'م', tags: ['بالقوه'],            score: 41, value: 0,        stage: 0, since: '۱۴۰۴', convs: 2,  last: 'دیروز', city: 'کرج', phone: '۰۹۱۲ ۵۵۵ ۶۶۷۷' },
  { id: 'c7',  name: 'سارا جعفری',    mono: 'س', tags: ['VIP','وفادار'],      score: 95, value: 22400000, stage: 3, since: '۱۴۰۱', convs: 47, last: '۲ روز پیش', city: 'تهران', phone: '۰۹۱۲ ۹۸۷ ۶۵۴۳' },
  { id: 'c8',  name: 'رضا قاسمی',     mono: 'ر', tags: ['غیرفعال'],           score: 22, value: 480000,   stage: 3, since: '۱۴۰۲', convs: 12, last: '۲ هفته پیش', city: 'اهواز', phone: '۰۹۱۶ 333 ۱۲۱۲' },
  { id: 'c9',  name: 'نگار صادقی',    mono: 'ن', tags: ['بالقوه'],            score: 67, value: 0,        stage: 1, since: '۱۴۰۴', convs: 5,  last: 'امروز', city: 'رشت', phone: '۰۹۱۱ ۲۳۴ ۵۶۷۸' },
  { id: 'c10', name: 'امیر تهرانی',   mono: 'ا', tags: ['در مذاکره'],         score: 79, value: 3600000,  stage: 2, since: '۱۴۰۳', convs: 18, last: 'امروز', city: 'قم', phone: '۰۹۱۹ ۸۷۶ ۵۴۳۲' },
];

// ── AI-derived CRM signals (extracted from conversation content) ──
// Built automatically from each customer's messages — the human only
// confirms/edits. Keyed by customer id.
//   sentiment : مثبت | خنثی | منفی  (آخرین حال‌وهوای مکالمه)
//   idle      : روزهای بی‌پاسخ‌ماندن از آخرین پیام مشتری (برای ریسک سرد شدن)
//   summary   : خلاصه‌ی یک‌خطی هوشمند از کل تعامل
//   next      : قدم بعدی پیشنهادی + موعد + اینکه عقب‌افتاده است یا نه
//   auto      : برچسب‌های خودکارِ دسته‌بندی‌شده (هر کدام یک بُعد جدا)
//     interests  : علاقه‌مندی‌ها (چندمقداری)
//     objections : اعتراض‌ها/موانع خرید (برای پیگیری)
//     source     : منبع آشنایی (تک‌مقداری)
//     evidence   : پیامی که این سیگنال‌ها از آن استخراج شده (برای اعتماد)
const CRM_AI = {
  c1:  { sentiment: 'منفی', idle: 0, conf: 92,
         summary: 'مشتری وفادار با خرید بالا؛ الان بابت تأخیر سفارش ۸۸۲۱ ناراضی و منتظر پاسخ است.',
         next: { text: 'وضعیت ارسال سفارش ۸۸۲۱ را پیگیری و به مشتری اطلاع بده', due: 'امروز', overdue: true },
         auto: { interests: ['ارسال سریع', 'تخفیف حجمی'], objections: ['تأخیر در ارسال'], source: 'کانال', evidence: '«سفارش من هنوز ارسال نشده؟»' } },
  c2:  { sentiment: 'خنثی', idle: 0, conf: 74,
         summary: 'سرنخ تازه؛ درباره‌ی قیمت پلن سالانه‌ی اشتراک پرس‌وجو کرده و هنوز قیمت نگرفته.',
         next: { text: 'قیمت پلن سالانه را همراه با مزایا ارسال کن', due: 'امروز', overdue: false },
         auto: { interests: ['اشتراک سالانه'], objections: [], source: 'تبلیغات', evidence: '«قیمت پلن سالانه چقدره؟»' } },
  c3:  { sentiment: 'مثبت', idle: 0, conf: 88,
         summary: 'مشتری راضی؛ مشکل بازیابی رمز پنل حل شد و تشکر کرد.',
         next: { text: 'پیشنهاد فروش مکمل متناسب با خرید قبلی را مطرح کن', due: 'این هفته', overdue: false },
         auto: { interests: ['پنل کاربری'], objections: [], source: 'معرفی', evidence: '«ممنون، مشکل حل شد 🙏»' } },
  c4:  { sentiment: 'خنثی', idle: 0, conf: 81,
         summary: 'در مرحله‌ی مذاکره؛ پیش‌فاکتور خواسته و منتظر است — فرصت داغ.',
         next: { text: 'پیش‌فاکتور درخواستی را تهیه و ارسال کن', due: 'امروز', overdue: true },
         auto: { interests: ['خرید سازمانی'], objections: ['نیاز به تأیید مدیر'], source: 'تیم فروش', evidence: '«پیش‌فاکتور رو برام بفرستید لطفاً»' } },
  c5:  { sentiment: 'مثبت', idle: 1, conf: 58,
         summary: 'خریدار اولِ خرد؛ تجربه‌ی اول مثبت بوده، آماده‌ی تبدیل به مشتری تکرارشونده.',
         next: { text: 'بازخورد خرید اول را بپرس و کد تخفیف خرید بعدی بده', due: 'فردا', overdue: false },
         auto: { interests: ['خرید خرد'], objections: [], source: 'کانال', evidence: 'سفارش اول ثبت‌شده' } },
  c6:  { sentiment: 'خنثی', idle: 1, conf: 41,
         summary: 'سرنخ سرد و کم‌تعامل؛ فقط دو پیام داشته و نیاز روشنی ابراز نکرده.',
         next: { text: 'با یک پیام ارزش‌محور دوباره درگیرش کن', due: 'این هفته', overdue: false },
         auto: { interests: [], objections: ['نامشخص بودن نیاز'], source: 'کانال', evidence: 'تعامل محدود' } },
  c7:  { sentiment: 'مثبت', idle: 2, conf: 95,
         summary: 'مشتری وفادار و مروّج؛ از محصول راضی بوده و قول معرفی داده.',
         next: { text: 'کد معرف اختصاصی برای دعوت دوستان بفرست', due: 'این هفته', overdue: false },
         auto: { interests: ['برنامه‌ی معرفی'], objections: [], source: 'معرفی', evidence: '«حتماً معرفی می‌کنم.»' } },
  c8:  { sentiment: 'منفی', idle: 14, conf: 35,
         summary: 'مشتری غیرفعال؛ ۲ هفته بی‌پاسخ مانده و در خطر ریزش است.',
         next: { text: 'کمپین بازگشت با پیشنهاد ویژه برایش اجرا کن', due: 'امروز', overdue: true },
         auto: { interests: [], objections: ['عدم تعامل طولانی'], source: 'کانال', evidence: 'آخرین پیام ۲ هفته پیش' } },
  c9:  { sentiment: 'خنثی', idle: 0, conf: 67,
         summary: 'سرنخ علاقه‌مند؛ دنبال یک دوره‌ی خاص است ولی هنوز دقیق مشخص نکرده.',
         next: { text: 'چند گزینه‌ی دوره‌ی مرتبط را پیشنهاد بده', due: 'امروز', overdue: false },
         auto: { interests: ['دوره‌ی آموزشی'], objections: [], source: 'کانال', evidence: '«یه دوره‌ی خاص می‌خواستم...»' } },
  c10: { sentiment: 'مثبت', idle: 0, conf: 79,
         summary: 'در مذاکره و رو به جلو؛ خرید قبلی داشته و تعامل فعالی دارد.',
         next: { text: 'جمع‌بندی مذاکره را بفرست و برای نهایی‌کردن قرار بگذار', due: 'امروز', overdue: false },
         auto: { interests: ['ارتقای پلن'], objections: ['مقایسه‌ی قیمت'], source: 'تیم فروش', evidence: 'مکالمه‌ی فعال مذاکره' } },
};

// سیگنال‌های هوشمند یک مشتری (با fallback امن)
function custAI(c) {
  return CRM_AI[(c && c.id) || c] || { sentiment: 'خنثی', idle: 0, conf: 0, summary: '', next: null, auto: { interests: [], objections: [], source: '', evidence: '' } };
}
// آیا مشتری نیازمند پیگیری است؟ (قدم بعدیِ عقب‌افتاده یا سرد شدن)
function needsFollowup(c) {
  const a = custAI(c);
  return (a.next && a.next.overdue) || a.idle >= 7;
}

// اگر گفتگو نیاز به پیگیری دارد، علتش را برمی‌گرداند، وگرنه null
function convFollowup(conv) {
  const cu = CUSTOMERS.find(x => x.id === conv.customerId);
  if (!cu || !needsFollowup(cu)) return null;
  const a = custAI(cu);
  let reason;
  if (a.idle >= 7) reason = 'بیش از یک هفته بی‌پاسخ مانده — در خطر ریزش';
  else if (a.next && a.next.overdue) reason = a.next.text;
  else reason = 'منتظر اقدام بعدی';
  return { reason, sentiment: a.sentiment, idle: a.idle };
}

// پاسخ خودکار پیشنهادی دستیار فروش بر اساس پروفایل مشتری
function aiReplyFor(conv) {
  const cu = CUSTOMERS.find(x => x.id === conv.customerId);
  const a = cu ? custAI(cu) : null;
  // اگر هوش محلی پاسخ واقعی ساخته باشد، همان را استفاده کن
  if (a && a.suggestedReply) return a.suggestedReply;
  const first = cu ? cu.name.split(' ')[0] : 'دوست';
  const tail = a && a.next
    ? 'همین الان پیگیری می‌کنم و نتیجه را خدمتتان اعلام می‌کنم. ✅'
    : 'در خدمتم؛ لطفاً بفرمایید چطور می‌تونم کمکتون کنم. 🌿';
  return `سلام ${first} عزیز، ممنون از پیام‌تون. ${tail}`;
}

// ── Conversations (linked to customers) ───────────────────────
// status: open | pending | resolved
const CONVERSATIONS = [
  {
    id: 'v1', customerId: 'c1', status: 'open', unread: 2, assignee: 'تو',
    time: '۹:۴۱', preview: 'سلام، سفارش من هنوز ارسال نشده؟',
    messages: [
      { from: 'them', text: 'سلام وقت بخیر 🌿', t: '۹:۳۲' },
      { from: 'them', text: 'سفارش شماره ۸۸۲۱ رو سه روز پیش ثبت کردم.', t: '۹:۳۳' },
      { from: 'me',   text: 'سلام مریم جان، الان بررسی می‌کنم خدمتتون.', t: '۹:۳۵' },
      { from: 'them', text: 'سلام، سفارش من هنوز ارسال نشده؟', t: '۹:۴۱' },
    ],
  },
  {
    id: 'v2', customerId: 'c2', status: 'pending', unread: 0, assignee: 'سمیرا',
    time: '۹:۲۰', preview: 'قیمت پلن سالانه چقدره؟',
    messages: [
      { from: 'them', text: 'سلام، می‌خواستم درباره‌ی اشتراک بپرسم.', t: '۹:۱۸' },
      { from: 'them', text: 'قیمت پلن سالانه چقدره؟', t: '۹:۲۰' },
    ],
  },
  {
    id: 'v3', customerId: 'c4', status: 'open', unread: 1, assignee: 'تو',
    time: '۸:۵۵', preview: 'پیش‌فاکتور رو برام بفرستید لطفاً', 
    messages: [
      { from: 'them', text: 'با تیم فروش هماهنگ کردم.', t: '۸:۵۰' },
      { from: 'them', text: 'پیش‌فاکتور رو برام بفرستید لطفاً', t: '۸:۵۵' },
    ],
  },
  {
    id: 'v4', customerId: 'c3', status: 'resolved', unread: 0, assignee: 'تو',
    time: 'دیروز', preview: 'ممنون، مشکل حل شد 🙏',
    messages: [
      { from: 'them', text: 'سلام، رمز پنل رو فراموش کردم.', t: '۱۸:۰۲' },
      { from: 'me',   text: 'لینک بازیابی رو فرستادم، چک کنید.', t: '۱۸:۰۵' },
      { from: 'them', text: 'ممنون، مشکل حل شد 🙏', t: '۱۸:۱۰' },
    ],
  },
  {
    id: 'v5', customerId: 'c9', status: 'pending', unread: 0, assignee: 'سمیرا',
    time: 'دیروز', preview: 'یه دوره‌ی خاص می‌خواستم...',
    messages: [
      { from: 'them', text: 'یه دوره‌ی خاص می‌خواستم...', t: '۱۶:۴۰' },
    ],
  },
  {
    id: 'v6', customerId: 'c7', status: 'resolved', unread: 0, assignee: 'تو',
    time: '۲ روز پیش', preview: 'عالی بود، حتماً معرفی می‌کنم.',
    messages: [
      { from: 'them', text: 'محصول رو دریافت کردم.', t: '۱۱:۰۰' },
      { from: 'them', text: 'عالی بود، حتماً معرفی می‌کنم.', t: '۱۱:۰۲' },
      { from: 'me',   text: 'خوشحالیم که راضی بودید 🌟', t: '۱۱:۱۵' },
    ],
  },
  {
    id: 'v7', customerId: 'c5', status: 'resolved', unread: 0, assignee: 'تو',
    time: 'دیروز', preview: 'دستم رسید، ممنون!',
    messages: [
      { from: 'them', text: 'سلام، سفارش اولم رو گرفتم.', t: '۱۴:۱۰' },
      { from: 'me',   text: 'خوشحالیم زهرا جان! تجربه‌تون چطور بود؟', t: '۱۴:۱۵' },
      { from: 'them', text: 'دستم رسید، ممنون!', t: '۱۴:۲۰' },
    ],
  },
  {
    id: 'v8', customerId: 'c6', status: 'pending', unread: 0, assignee: 'سمیرا',
    time: 'دیروز', preview: 'فعلاً فقط نگاه می‌کنم.',
    messages: [
      { from: 'them', text: 'سلام', t: '۱۰:۰۰' },
      { from: 'them', text: 'فعلاً فقط نگاه می‌کنم.', t: '۱۰:۰۲' },
    ],
  },
  {
    id: 'v9', customerId: 'c8', status: 'open', unread: 0, assignee: 'تو',
    time: '۲ هفته پیش', preview: 'دیگه فعلاً نیازی ندارم.',
    messages: [
      { from: 'them', text: 'سلام، یه مشکلی با سفارش قبلی داشتم.', t: '۰۹:۰۰' },
      { from: 'me',   text: 'بله رضا جان، در خدمتم؛ مشکل چی بود؟', t: '۰۹:۰۵' },
      { from: 'them', text: 'دیگه فعلاً نیازی ندارم.', t: '۰۹:۳۰' },
    ],
  },
  {
    id: 'v10', customerId: 'c10', status: 'open', unread: 1, assignee: 'تو',
    time: 'امروز', preview: 'پلن ارتقا رو بیشتر توضیح می‌دید؟',
    messages: [
      { from: 'them', text: 'مذاکره‌ی خوبی بود، ممنون.', t: '۱۲:۰۰' },
      { from: 'them', text: 'پلن ارتقا رو بیشتر توضیح می‌دید؟', t: '۱۲:۰۵' },
    ],
  },
];

// ── Notifications (CRM software news + Rubika platform updates) ─
const NOTIFICATIONS = [
  { id: 'n1', kind: 'app',    icon: 'bolt',   title: 'نسخه ۱.۱ روبیکا CRM منتشر شد', body: 'بخش «دستیار فروش هوشمند» و گزارش‌های دوره‌ای (هفته/ماه/سال) اضافه شد.', time: '۲ ساعت پیش', unread: true },
  { id: 'n2', kind: 'rubika', icon: 'robot',  title: 'به‌روزرسانی API ربات روبیکا', body: 'امکان ارسال پیام گروهی و دکمه‌های شیشه‌ای به ربات‌ها اضافه شد؛ توکن‌های فعلی بدون تغییر کار می‌کنند.', time: 'دیروز', unread: true },
  { id: 'n3', kind: 'rubika', icon: 'shield', title: 'تغییر در سیاست امنیتی روبیکا', body: 'از ابتدای تیر ۱۴۰۴ احراز هویت دو مرحله‌ای برای ربات‌های تجاری اجباری می‌شود.', time: '۲ روز پیش', unread: false },
  { id: 'n4', kind: 'app',    icon: 'check',  title: 'پشتیبان‌گیری خودکار انجام شد', body: 'داده‌های مشتریان شما با موفقیت پشتیبان‌گیری شد.', time: '۳ روز پیش', unread: false },
  { id: 'n5', kind: 'rubika', icon: 'star',   title: 'روبیکا به ۱۰۰ میلیون کاربر رسید', body: 'فرصت خوبی برای گسترش کانال فروش؛ نرخ تعامل کانال‌های تجاری ۱۸٪ افزایش یافت.', time: '۱ هفته پیش', unread: false },
  { id: 'n6', kind: 'app',    icon: 'bolt',   title: 'بهبود سرعت بارگذاری گفتگوها', body: 'بارگذاری فهرست گفتگوها اکنون حدود ۴۰٪ سریع‌تر است.', time: '۲ هفته پیش', unread: false },
];

// ── Team members (operators) ──────────────────────────────────
const TEAM = [
  { id: 'u1', name: 'علی رضایی',   mono: 'ع', role: 'مدیر',         online: true,  convs: 128, rate: 96 },
  { id: 'u2', name: 'سمیرا احمدی', mono: 'س', role: 'اپراتور ارشد', online: true,  convs: 212, rate: 94 },
  { id: 'u3', name: 'نوید کرمانی', mono: 'ن', role: 'اپراتور',      online: false, convs: 87,  rate: 89 },
  { id: 'u4', name: 'مینا توکلی',  mono: 'م', role: 'اپراتور',      online: true,  convs: 64,  rate: 91 },
];

// ── Support tickets ───────────────────────────────────────────
const TICKETS = [
  { id: 't1', subject: 'مشکل در اتصال درگاه پرداخت', customer: 'مریم رضایی', status: 'open',     priority: 'بالا',   time: '۱ ساعت پیش' },
  { id: 't2', subject: 'سؤال درباره‌ی فاکتور رسمی',   customer: 'امیر تهرانی', status: 'open',     priority: 'متوسط', time: '۳ ساعت پیش' },
  { id: 't3', subject: 'درخواست بازگشت وجه',          customer: 'رضا قاسمی',  status: 'resolved', priority: 'پایین', time: 'دیروز' },
];

// ── Automation flows ──────────────────────────────────────────
const AUTOMATIONS = [
  { id: 'a1', name: 'خوش‌آمدگویی به مشتری جدید',      trigger: 'عضویت در کانال',        on: true,  runs: 340 },
  { id: 'a2', name: 'پاسخ خودکار خارج از ساعت کاری', trigger: 'پیام بعد از ۲۰:۰۰',     on: true,  runs: 128 },
  { id: 'a3', name: 'پیگیری سبد رهاشده',              trigger: 'بدون پاسخ تا ۲۴ ساعت',  on: false, runs: 56 },
  { id: 'a4', name: 'برچسب‌گذاری خودکار VIP',         trigger: 'خرید بالای ۱۰ میلیون',  on: true,  runs: 18 },
];

// quick replies
const QUICK_REPLIES = [
  'سلام، چطور می‌تونم کمکتون کنم؟',
  'الان بررسی می‌کنم خدمتتون 🙏',
  'ممنون از صبوری‌تون.',
  'سفارش شما ارسال شد ✅',
];

// activity timeline for a customer profile
const TIMELINE = [
  { type: 'purchase', title: 'خرید انجام شد', detail: 'سفارش ۸۸۲۱ — ۲٬۴۰۰٬۰۰۰ تومان', t: 'امروز ۹:۱۰' },
  { type: 'message',  title: 'پیام جدید',     detail: '«سلام، سفارش من هنوز ارسال نشده؟»', t: 'امروز ۹:۴۱' },
  { type: 'tag',      title: 'برچسب اضافه شد', detail: 'VIP', t: 'دیروز' },
  { type: 'note',     title: 'یادداشت تیمی',   detail: 'مشتری به تخفیف حجمی علاقه‌منده.', t: '۳ روز پیش' },
  { type: 'join',     title: 'عضویت در کانال', detail: '@avin_shop', t: '۱۴۰۲' },
];

Object.assign(window, {
  fa, faMoney, BUSINESSES, KPIS, KPIS_BY_PERIOD, ACTIVITY, PEAK_HOURS, FUNNEL,
  CUSTOMERS, CONVERSATIONS, QUICK_REPLIES, TIMELINE,
  CRM_AI, custAI, needsFollowup, convFollowup, aiReplyFor,
  NOTIFICATIONS, TEAM, TICKETS, AUTOMATIONS,
});

// ── اتصال به داده‌ی واقعی روبیکا ─────────────────────────────────
// داده‌ی واقعی را از سرور می‌گیرد و جای داده‌ی ساختگی می‌نشاند، بعد
// رابط را دوباره رندر می‌کند. اگر سرور در دسترس نبود (مثلاً پیش‌نمایش
// ساده)، داده‌ی نمونه باقی می‌ماند.
async function loadBusinesses() {
  try {
    const res = await fetch('/api/businesses');
    if (!res.ok) return;
    const list = await res.json();
    if (Array.isArray(list) && list.length) {
      BUSINESSES.length = 0;
      list.forEach(b => BUSINESSES.push({
        id: b.id, name: b.name, kind: 'کسب‌وکار',
        mono: b.mono || (b.name || '؟').slice(0, 1),
        channel: (b.channels || []).map(c => c.label).join('، ') || 'بدون کانال',
        members: b.members || 0,
        channels: b.channels || [],
        handle: b.handle || '',
      }));
      if (!window.__bizId || !BUSINESSES.some(b => b.id === window.__bizId)) {
        window.__bizId = BUSINESSES[0].id;
      }
    }
  } catch (e) { /* بدون سرور */ }
}
window.loadBusinesses = loadBusinesses;

async function loadRealData() {
  try {
    await loadBusinesses();
    const res = await fetch('/api/proto-data?biz=' + encodeURIComponent(window.__bizId || ''));
    if (!res.ok) return;
    const data = await res.json();
    if (Array.isArray(data.customers)) {
      CUSTOMERS.length = 0;
      data.customers.forEach(c => CUSTOMERS.push(c));
    }
    if (Array.isArray(data.conversations)) {
      CONVERSATIONS.length = 0;
      data.conversations.forEach(c => CONVERSATIONS.push(c));
    }
    // KPIهای هر بازه (با حفظ مرجع آرایه‌ها)
    if (data.kpis) {
      ['day','week','month','year'].forEach(p => {
        if (Array.isArray(data.kpis[p]) && KPIS_BY_PERIOD[p]) {
          KPIS_BY_PERIOD[p].length = 0;
          data.kpis[p].forEach(k => KPIS_BY_PERIOD[p].push(k));
        }
      });
    }
    if (Array.isArray(data.activity)) {
      ACTIVITY.length = 0;
      data.activity.forEach(a => ACTIVITY.push(a));
    }
    if (Array.isArray(data.peakHours)) {
      PEAK_HOURS.length = 0;
      data.peakHours.forEach(h => PEAK_HOURS.push(h));
    }
    // سیگنال‌های هوش مصنوعی هر مشتری (خلاصه، احساسات، پیگیری، برچسب)
    if (data.crmAI) {
      Object.keys(CRM_AI).forEach(k => delete CRM_AI[k]);
      Object.assign(CRM_AI, data.crmAI);
    }
    // بخش‌های عملیاتی واقعی
    const replaceArr = (arr, next) => { if (Array.isArray(next)) { arr.length = 0; next.forEach(x => arr.push(x)); } };
    replaceArr(NOTIFICATIONS, data.notifications);
    replaceArr(TEAM, data.team);
    replaceArr(TICKETS, data.tickets);
    replaceArr(AUTOMATIONS, data.automations);
    replaceArr(FUNNEL, data.funnel);
    if (typeof window.__refresh === 'function') window.__refresh();
  } catch (e) { /* سرور در دسترس نیست — داده‌ی نمونه می‌ماند */ }
}
window.loadRealData = loadRealData;
loadRealData();
// هر ۴ ثانیه داده را تازه کن تا پیام‌های جدید روبیکا ظاهر شوند
setInterval(loadRealData, 4000);
