/* X-REAL Stock System — Utilities + Seed Data */

// ─── SEED DATA ────────────────────────────────────────────────────────
const SEED_CATS = [
  { id: "cat1", name: "Protein", color: "#3b82f6" },
  { id: "cat2", name: "Gel",     color: "#10b981" },
  { id: "cat3", name: "Accessories", color: "#8b5cf6" },
];

const SEED_PRODUCTS = [
  { id:"p01",sku:"Ori-s",     barcode:"8859445801862",name:"Protein Original Sachet",      unit:"ซอง",    catId:"cat1",active:true},
  { id:"p02",sku:"Cocoa-s",   barcode:"8859445801855",name:"Protein Cocoa Sachet",          unit:"ซอง",    catId:"cat1",active:true},
  { id:"p03",sku:"Ori-box",   barcode:"8859445801756",name:"Protein Original Box (10s)",    unit:"กล่อง",  catId:"cat1",active:true},
  { id:"p04",sku:"Cocoa-box", barcode:"8859445801732",name:"Protein Cocoa Box (10s)",       unit:"กล่อง",  catId:"cat1",active:true},
  { id:"p05",sku:"Ori-zip",   barcode:"8859445801763",name:"Protein Original Zipbag (26s)", unit:"ถุง",    catId:"cat1",active:true},
  { id:"p06",sku:"Cocoa-zip", barcode:"8859445801749",name:"Protein Cocoa Zipbag (26s)",    unit:"ถุง",    catId:"cat1",active:true},
  { id:"p07",sku:"Ori-ctn",   barcode:"8859445803774",name:"Protein Original Tub 2lbs",     unit:"กระปุก", catId:"cat1",active:true},
  { id:"p08",sku:"Cocoa-ctn", barcode:"8859445803781",name:"Protein Cocoa Tub 2lbs",        unit:"กระปุก", catId:"cat1",active:true},
  { id:"p14",sku:"bc-s",      barcode:"8859084414386",name:"Gel Blackcurrant Sachet",        unit:"ซอง",    catId:"cat2",active:true},
  { id:"p15",sku:"orng-s",    barcode:"8859084414362",name:"Gel Orange Sachet",              unit:"ซอง",    catId:"cat2",active:true},
  { id:"p16",sku:"cola-s",    barcode:"8859084415949",name:"Gel Cola Sachet",                unit:"ซอง",    catId:"cat2",active:true},
  { id:"p17",sku:"box-bc",    barcode:"8859084414379",name:"Gel Blackcurrant Box (12s)",     unit:"กล่อง",  catId:"cat2",active:true},
  { id:"p18",sku:"box-orng",  barcode:"8859084414355",name:"Gel Orange Box (12s)",           unit:"กล่อง",  catId:"cat2",active:true},
  { id:"p19",sku:"box-cola",  barcode:"8859084415932",name:"Gel Cola Box (12s)",             unit:"กล่อง",  catId:"cat2",active:true},
  { id:"p24",sku:"trex-shaker",barcode:"360019",      name:"Shaker T-Rex",                  unit:"อัน",    catId:"cat3",active:true},
  { id:"p25",sku:"w-shaker",  barcode:"360020",       name:"Shaker White",                  unit:"อัน",    catId:"cat3",active:true},
  { id:"p26",sku:"KT-shaker", barcode:"363072",       name:"Shaker Khaki/Tan",              unit:"อัน",    catId:"cat3",active:true},
];

const SEED_LOCATIONS = [
  { id:"l1", name:"บ้าน",         isStorage:true,  locType:"storage" },
  { id:"l2", name:"Mycloud Fulfillment", isStorage:true, locType:"storage" },
  { id:"l3", name:"ออกบูธ",       isStorage:false, locType:"event" },
  { id:"l4", name:"Wholesale",     isStorage:false, locType:"outbound" },
  { id:"l5", name:"ฝากขาย",        isStorage:false, locType:"consignment" },
];

const SEED_REPACK = [
  { id:"rp1", parentSku:"Ori-ctn",  childSku:"Ori-s",   ratio:26, label:"แบ่งกระปุก 2lbs → ซอง" },
  { id:"rp2", parentSku:"Cocoa-ctn",childSku:"Cocoa-s", ratio:26, label:"แบ่งกระปุก 2lbs → ซอง" },
  { id:"rp3", parentSku:"Ori-zip",  childSku:"Ori-s",   ratio:26, label:"แบ่งถุง zip → ซอง" },
  { id:"rp4", parentSku:"Cocoa-zip",childSku:"Cocoa-s", ratio:26, label:"แบ่งถุง zip → ซอง" },
  { id:"rp5", parentSku:"Ori-box",  childSku:"Ori-s",   ratio:10, label:"แบ่งกล่อง → ซอง" },
  { id:"rp6", parentSku:"Cocoa-box",childSku:"Cocoa-s", ratio:10, label:"แบ่งกล่อง → ซอง" },
  { id:"rp7", parentSku:"box-bc",   childSku:"bc-s",    ratio:12, label:"แบ่งกล่อง → ซอง" },
  { id:"rp8", parentSku:"box-orng", childSku:"orng-s",  ratio:12, label:"แบ่งกล่อง → ซอง" },
  { id:"rp9", parentSku:"box-cola", childSku:"cola-s",  ratio:12, label:"แบ่งกล่อง → ซอง" },
];

const SEED_STORES = [
  { id:"s1", name:"AllSport Bangkok", branches:[
    { id:"b1", name:"สาขาเซ็นทรัล" },
    { id:"b2", name:"สาขาเอ็มควอเทียร์" },
  ]},
];

// Seed some demo stock so the dashboard isn't empty
const SEED_STOCKS = [
  { id:"st1", skuId:"p01", locId:"l1", qty:480, expDate:"2026-08-15", lot:"LOT-A1", ts:"2026-04-12T09:00:00Z" },
  { id:"st2", skuId:"p01", locId:"l2", qty:200, expDate:"2026-08-15", lot:"LOT-A1", ts:"2026-04-14T09:00:00Z" },
  { id:"st3", skuId:"p02", locId:"l1", qty:320, expDate:"2026-07-30", lot:"LOT-A2", ts:"2026-04-12T09:00:00Z" },
  { id:"st4", skuId:"p02", locId:"l2", qty:120, expDate:"2026-07-30", lot:"LOT-A2", ts:"2026-04-14T09:00:00Z" },
  { id:"st5", skuId:"p03", locId:"l1", qty:48,  expDate:"2026-12-01", lot:"LOT-B3", ts:"2026-03-20T09:00:00Z" },
  { id:"st6", skuId:"p07", locId:"l1", qty:24,  expDate:"2026-11-15", lot:"LOT-C1", ts:"2026-03-20T09:00:00Z" },
  { id:"st7", skuId:"p08", locId:"l1", qty:18,  expDate:"2026-06-10", lot:"LOT-C2", ts:"2026-03-20T09:00:00Z" }, // soon expiring
  { id:"st8", skuId:"p14", locId:"l1", qty:240, expDate:"2027-01-20", lot:"LOT-G1", ts:"2026-02-15T09:00:00Z" },
  { id:"st9", skuId:"p15", locId:"l1", qty:180, expDate:"2027-02-12", lot:"LOT-G2", ts:"2026-02-15T09:00:00Z" },
  { id:"st10", skuId:"p16", locId:"l1", qty:160, expDate:"2026-05-30", lot:"LOT-G3", ts:"2025-12-15T09:00:00Z" }, // very soon
  { id:"st11", skuId:"p17", locId:"l1", qty:24, expDate:"2027-01-20", lot:"LOT-G1", ts:"2026-02-15T09:00:00Z" },
  { id:"st12", skuId:"p24", locId:"l1", qty:36, expDate:"", lot:"", ts:"2026-03-20T09:00:00Z" },
  { id:"st13", skuId:"p25", locId:"l1", qty:42, expDate:"", lot:"", ts:"2026-03-20T09:00:00Z" },
  { id:"st14", skuId:"p26", locId:"l1", qty:18, expDate:"", lot:"", ts:"2026-03-20T09:00:00Z" },
  { id:"st15", skuId:"p05", locId:"l1", qty:32, expDate:"2026-10-01", lot:"LOT-D1", ts:"2026-03-01T09:00:00Z" },
  { id:"st16", skuId:"p06", locId:"l1", qty:28, expDate:"2026-10-01", lot:"LOT-D1", ts:"2026-03-01T09:00:00Z" },
];

const SEED_HISTORY = [
  { id:"h1", ts:"2026-05-08T10:30:00Z", user:"พี่จิน", action:"นำเข้า", detail:"→บ้าน | Ori-s×500, Cocoa-s×300 | รับของ PO-2026-04" },
  { id:"h2", ts:"2026-05-08T14:15:00Z", user:"พี่จิน", action:"โอนย้าย", detail:"Ori-s 200ซอง | บ้าน→Mycloud Fulfillment | รอบส่ง A" },
  { id:"h3", ts:"2026-05-09T11:00:00Z", user:"แอ๊ม", action:"นำออก", detail:"จากบ้าน | Ori-box×5, Cocoa-box×3 | จำหน่าย | ส่งร้าน RunPaul" },
  { id:"h4", ts:"2026-05-10T09:45:00Z", user:"แอ๊ม", action:"Re-pack", detail:"Ori-ctn×1→Ori-s×26 | เตรียมออกบูธ" },
  { id:"h5", ts:"2026-05-11T08:20:00Z", user:"พี่จิน", action:"โอนย้าย", detail:"Ori-s 100ซอง | บ้าน→ออกบูธ | Hyrox Bangkok" },
];

const SEED_RESERVATIONS = [
  { id:"r1", title:"Hyrox Bangkok — May 25",  type:"event", customer:"Hyrox TH",
    dueDate:"25/05/2026", note:"ออกบูธ 2 วัน", status:"pending",
    items:[{ skuId:"p01", qty:100 },{ skuId:"p02", qty:80 },{ skuId:"p16", qty:60 }],
    createdAt:"2026-05-01T09:00:00Z" },
  { id:"r2", title:"RunPaul PO-2026-05", type:"wholesale", customer:"RunPaul Sports",
    dueDate:"18/05/2026", note:"ส่งเข้าร้าน 3 สาขา", status:"pending",
    items:[{ skuId:"p03", qty:24 },{ skuId:"p04", qty:18 }],
    createdAt:"2026-05-04T09:00:00Z" },
  { id:"r3", title:"AllSport Top-up มิ.ย.", type:"consignment", customer:"AllSport Bangkok",
    dueDate:"02/06/2026", note:"เติมยอดฝากขายรายเดือน", status:"pending",
    items:[{ skuId:"p07", qty:6 },{ skuId:"p08", qty:6 }],
    createdAt:"2026-05-05T09:00:00Z" },
];

// ─── UTILITY FUNCTIONS ────────────────────────────────────────────────
const uid = () => Math.random().toString(36).slice(2, 9);
const pad = n => String(n).padStart(2, "0");

const fmtDT = iso => { if (!iso) return "—"; const d = new Date(iso); return `${pad(d.getDate())}/${pad(d.getMonth()+1)}/${d.getFullYear()} ${pad(d.getHours())}:${pad(d.getMinutes())}`; };
const fmtD  = iso => { if (!iso) return "—"; const d = new Date(iso); return `${pad(d.getDate())}/${pad(d.getMonth()+1)}/${d.getFullYear()}`; };
const fmtRel = iso => {
  if (!iso) return "—";
  const diff = Math.floor((Date.now() - new Date(iso)) / 1000);
  if (diff < 60) return "เมื่อสักครู่";
  if (diff < 3600) return `${Math.floor(diff/60)} นาทีก่อน`;
  if (diff < 86400) return `${Math.floor(diff/3600)} ชม.ก่อน`;
  if (diff < 86400 * 7) return `${Math.floor(diff/86400)} วันก่อน`;
  return fmtD(iso);
};

const THIS_YEAR  = new Date().getFullYear();
const THIS_MONTH = new Date().getMonth() + 1;
const MONTHS_TH  = ["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."];

function expStatus(exp) {
  if (!exp) return "none";
  const d = (new Date(exp) - new Date()) / 86400000;
  if (d < 0) return "expired";
  if (d <= 30) return "warn";
  if (d <= 90) return "soon";
  return "ok";
}
function daysUntil(date) {
  if (!date) return null;
  return Math.ceil((new Date(date) - new Date()) / 86400000);
}

// dd/mm/yyyy <-> ISO
function dmyToIso(dmy) {
  if (!dmy || !dmy.includes("/")) return "";
  const [d, m, y] = dmy.split("/");
  if (!d || !m || !y || y.length !== 4) return "";
  return `${y}-${m.padStart(2, "0")}-${d.padStart(2, "0")}`;
}
function isoToDmy(iso) {
  if (!iso) return "";
  const [y, m, d] = iso.split("-");
  if (!y || !m || !d) return iso;
  return `${d}/${m}/${y}`;
}

// FIFO deduction utility (mutates passed array's items qty)
function fifoDeduct(skuId, locId, qty, curStocks) {
  const bs = curStocks.filter(s => s.skuId === skuId && s.locId === locId).sort((a, b) => {
    if (!a.expDate && !b.expDate) return new Date(a.ts) - new Date(b.ts);
    if (!a.expDate) return 1;
    if (!b.expDate) return -1;
    return new Date(a.expDate) - new Date(b.expDate) || new Date(a.ts) - new Date(b.ts);
  });
  if (bs.reduce((a, b) => a + b.qty, 0) < qty) return null;
  let rem = qty;
  for (const b of bs) {
    if (rem <= 0) break;
    const t = Math.min(b.qty, rem);
    b.qty -= t;
    rem -= t;
  }
  return curStocks.filter(s => s.qty > 0);
}

Object.assign(window, {
  SEED_CATS, SEED_PRODUCTS, SEED_LOCATIONS, SEED_REPACK, SEED_STORES,
  SEED_STOCKS, SEED_HISTORY, SEED_RESERVATIONS,
  uid, pad, fmtDT, fmtD, fmtRel,
  THIS_YEAR, THIS_MONTH, MONTHS_TH,
  expStatus, daysUntil, dmyToIso, isoToDmy, fifoDeduct,
});
