window.FB = window.FB || {};
FB.config = {
  SUPABASE_URL: "https://sxdscdcuchahvkzrhiqb.supabase.co",
  SUPABASE_ANON_KEY: "sb_publishable_7atvDU_Z5jB_1I4pM79cTw_GlFfupHp",
  PHOTO_BASE: "https://sxdscdcuchahvkzrhiqb.supabase.co/storage/v1/object/public/item-photos/",
};
// defaultLang: staff 越南文, admin 中文
FB.USERS = [
  { name: "Mai Thi", email: "mai@fragile.local",   role: "staff", defaultLang: "vi" },
  { name: "Xuyen",   email: "xuyen@fragile.local", role: "staff", defaultLang: "vi" },
  { name: "Admin",   email: "admin@fragile.local", role: "admin", defaultLang: "zh" },
];
FB.STORES = [
  { id: "MY0001", name: "Austin" },
  { id: "MY0002", name: "Kulai" },
];
// role -> 可见页面 (顺序即导航顺序)
// 底部导航最多 5 个 (手机放得下); 其余进左上角菜单
FB.NAV_BOTTOM = {
  staff: ["clockin", "today", "shipping", "stock", "task"],
  admin: ["dashboard", "review", "receive", "task", "production"],
};
FB.NAV_MENU = {
  staff: [],
  admin: ["today", "ordering", "shipping", "stock", "clockin", "attendance", "baseline", "sop", "settings"],
};
FB.NAV = {
  staff: ["clockin", "today", "shipping", "stock", "task", "sop"],
  admin: ["dashboard", "today", "review", "receive", "task", "production", "ordering", "shipping", "stock", "clockin", "attendance", "baseline", "sop", "settings"],
};
// 员工可开放的页面 (admin 在设置里勾)
FB.STAFF_OPTIONAL = ["clockin", "today", "shipping", "stock", "task", "sop", "production", "receive"];
// admin 全部页面 (底部导航自选的候选池; 没选进底部的自动进 ☰)
FB.ADMIN_PAGES = ["dashboard", "today", "review", "receive", "ordering", "production", "shipping", "stock", "baseline", "task", "clockin", "attendance", "sop", "settings"];
// 每个 role 可用语言
FB.LANGS = { staff: ["vi", "zh", "en"], admin: ["zh", "en"] };
// 门店抬头 (签收单用)
FB.COMPANY = {
  name: "FRAGILE BURGER HOLDING SDN BHD",
  addr: "17, Jln Sierra Perdana 4, Taman Sierra Perdana, 81750 Masai, Johor Darul Ta'zim",
  tel: "011-2688 7353",
};
FB.STORE_ADDR = {
  MY0001: "Austin Store (MY0001)",
  MY0002: "292, Jalan Kiambang Utama, Komersial Indah, Bandar Indahpura, 81000 Kulai, Johor Darul Ta'zim",
};

// 「每包 1 个」的包装:用量 = 产出包数 (batch × batch_yield),不按批数
// 2026-07-22 Shanqian 指出 sauce 的 PE 袋应为每 pkt 1 个
FB.PER_PACK_ITEMS = ["C0002"];

// 订货单要在箱数后面附上换算量的供应商(报单不按箱算的)
// 其他供应商习惯按 ctn 报,附换算反而多余
FB.PCS_SUPPLIERS = ["China Supplier"];

// ── 出货签收单打印模板 (出货 + 补发单据 共用) ──
// 目标: 一张单 = 一页 A4。行数多时自动降字号/行距, 34 行内都塞得下。
FB.invoiceHtml = function ({ no, date, storeId, storeName, rows, preparedBy }) {
  const c = FB.COMPANY;
  const n = rows.length;
  // 密度三档
  const d = n <= 14 ? { f: 11, p: 4.5, head: 13, gap: 12, sign: 26 }
          : n <= 22 ? { f: 10, p: 3.0, head: 12, gap: 9,  sign: 20 }
          :           { f: 9,  p: 2.0, head: 11, gap: 7,  sign: 16 };
  let sub = 0;
  const trs = rows.map((r) => {
    sub += r.amt;
    return `<tr><td>${r.code}</td><td>${r.name}</td><td class="r">${r.qty}</td><td>${r.unit}</td><td class="r">${r.price.toFixed(2)}</td><td class="r">${r.amt.toFixed(2)}</td></tr>`;
  }).join("");
  return `<!doctype html><html><head><meta charset="utf-8"><title>${no}</title><style>
    @page{size:A4;margin:12mm}
    *{font-family:Arial,Helvetica,sans-serif;box-sizing:border-box}
    body{margin:0;padding:0;color:#1c1917;font-size:${d.f}px;line-height:1.25}
    .sheet{page-break-inside:avoid}
    .top{display:flex;justify-content:space-between;margin-bottom:${d.gap}px}
    .co{font-weight:bold;font-size:${d.head}px}
    .addr{font-size:${d.f - 1}px;color:#44403c;max-width:320px;line-height:1.3}
    .inv{color:#b91c1c;font-weight:bold;font-size:${d.head + 6}px;text-align:right;line-height:1}
    .no{font-weight:bold;text-align:right;font-size:${d.f}px}
    .bill{border-left:3px solid #b91c1c;padding-left:7px;margin:${d.gap}px 0}
    table{width:100%;border-collapse:collapse}
    th{text-align:left;color:#78716c;font-size:${d.f - 1}px;border-bottom:1px solid #d6d3d1;padding:${d.p}px 4px}
    td{padding:${d.p}px 4px;border-bottom:1px solid #f5f5f4}
    tr{page-break-inside:avoid}
    .r{text-align:right}
    .tot{margin-top:${d.gap - 2}px;display:flex;justify-content:flex-end}
    .totbox{width:190px}
    .totrow{display:flex;justify-content:space-between;border-top:2px solid #1c1917;font-weight:bold;padding-top:4px}
    .sign{display:flex;justify-content:space-between;margin-top:${d.sign}px;font-size:${d.f - 1}px}
    .sign div{width:45%;border-top:1px solid #78716c;padding-top:3px;color:#57534e}
    @media print{body{padding:0}}
  </style></head><body><div class="sheet">
    <div class="top"><div><div class="co">${c.name}</div><div class="addr">${c.addr}<br>Tel: ${c.tel}</div></div>
    <div><div class="inv">DELIVERY</div><div class="no">${no}</div><div style="text-align:right;color:#78716c">Date: ${date}</div></div></div>
    <div class="bill"><b>To: ${storeName} (${storeId})</b><br><span style="color:#57534e">${FB.STORE_ADDR[storeId] || ""}</span></div>
    <table><thead><tr><th>Code</th><th>Item</th><th class="r">Qty</th><th>Unit</th><th class="r">Price</th><th class="r">Amount</th></tr></thead><tbody>${trs}</tbody></table>
    <div class="tot"><div class="totbox"><div class="totrow"><span>TOTAL</span><span>RM ${sub.toFixed(2)}</span></div></div></div>
    <div class="sign"><div>Prepared by: ${preparedBy}</div><div>Received by:</div></div>
  </div><script>window.onload=function(){setTimeout(function(){window.print()},300)}<\\/script></body></html>`;
};

// ── 草稿保存: 任何页面刷新都不丢 ──
FB.draft = {
  get(key, fallback) {
    try { const v = localStorage.getItem("fbd_" + key); return v ? JSON.parse(v) : fallback; }
    catch (e) { return fallback; }
  },
  set(key, val) { try { localStorage.setItem("fbd_" + key, JSON.stringify(val)); } catch (e) {} },
  clear(key) { try { localStorage.removeItem("fbd_" + key); } catch (e) {} },
};

// 供应商名宽松比对: "MR VEGE SDN BHD" ≈ "MR Vege"
FB.sameSupplier = function (a, b) {
  const n = (s) => String(s || "").toLowerCase().replace(/[^a-z0-9\u4e00-\u9fa5]/g, "");
  const x = n(a), y = n(b);
  if (!x || !y) return false;
  if (x === y) return true;
  const strip = (s) => s.replace(/(sdnbhd|enterprise|trading|sdn|bhd|company|co|ltd)/g, "");
  const sx = strip(x), sy = strip(y);
  if (sx && sy && (sx === sy || sx.includes(sy) || sy.includes(sx))) return true;
  return x.includes(y) || y.includes(x);
};
