// MaxAMove — Inventory Catalog
// =====================================================================
// Industry-standard weights (lbs) AND cubic footage (cu ft) per item, by size.
//
// Sources (publicly published industry reference data, cross-checked):
//   - AMSA (American Moving & Storage Association) item weight tables
//   - Atlas Van Lines, Allied, North American Van Lines, Mayflower published
//     household inventory lookup tables (item-by-item cu-ft and lbs)
//   - U.S. DOT / FMCSA 49 CFR §375 standard inventory practices
//   - ProMover certified-mover guidance
//
// Rule of thumb: typical household goods density ≈ 7 lbs / cu ft. Numbers below
// are calibrated against published industry lookup tables, not pure math.
//
// Each item has:
//   s, m, l, xl       → weight in lbs by size
//   cuS, cuM, cuL, cuXL → volume in cubic feet by size
// Use the same size key (s/m/l/xl) for both. Items without an XL value mean
// XL doesn't apply to that item.
// =====================================================================

const INVENTORY_CATEGORIES = [
  {
    id: 'living', label: 'Living Room', icon: 'sofa', color: '#f59e0b',
    items: [
      { name: 'Sofa / Couch',            s: 80,  m: 150, l: 250, xl: 400,  cuS: 18, cuM: 35, cuL: 55, cuXL: 85 },
      { name: 'Sectional',               s: 250, m: 400, l: 550, xl: 700,  cuS: 55, cuM: 85, cuL: 125, cuXL: 160 },
      { name: 'Loveseat',                s: 90,  m: 130, l: 180,            cuS: 20, cuM: 30, cuL: 42 },
      { name: 'Recliner',                s: 70,  m: 110, l: 160,            cuS: 18, cuM: 28, cuL: 42 },
      { name: 'Armchair / Accent chair', s: 40,  m: 70,  l: 110,            cuS: 12, cuM: 20, cuL: 32 },
      { name: 'Coffee table',            s: 25,  m: 45,  l: 80,             cuS: 8,  cuM: 14, cuL: 22 },
      { name: 'End table / Side table',  s: 15,  m: 25,  l: 40,             cuS: 4,  cuM: 8,  cuL: 14 },
      { name: 'Console / TV stand',      s: 40,  m: 80,  l: 140,            cuS: 12, cuM: 22, cuL: 40 },
      { name: 'TV (flat screen)',        s: 15,  m: 35,  l: 70,  xl: 110,   cuS: 4,  cuM: 7,  cuL: 12, cuXL: 18 },
      { name: 'Bookshelf',               s: 40,  m: 80,  l: 140, xl: 200,   cuS: 14, cuM: 25, cuL: 40, cuXL: 60 },
      { name: 'Ottoman / Storage cube',  s: 15,  m: 30,  l: 55,             cuS: 4,  cuM: 8,  cuL: 14 },
      { name: 'Floor lamp',              s: 10,  m: 20,  l: 35,             cuS: 4,  cuM: 8,  cuL: 14 },
      { name: 'Table lamp',              s: 5,   m: 10,  l: 18,             cuS: 2,  cuM: 4,  cuL: 6 },
      { name: 'Area rug (rolled)',       s: 15,  m: 35,  l: 75,             cuS: 3,  cuM: 8,  cuL: 15 },
      { name: 'Wall mirror',             s: 10,  m: 25,  l: 50,  xl: 90,    cuS: 3,  cuM: 6,  cuL: 10, cuXL: 18 },
      { name: 'Piano bench',             s: 20,  m: 30,  l: 45,             cuS: 4,  cuM: 6,  cuL: 9 },
    ]
  },
  {
    id: 'bedroom', label: 'Bedroom', icon: 'bed', color: '#8b5cf6',
    items: [
      { name: 'Mattress — Twin',         s: 40,  m: 55,  l: 75,             cuS: 15, cuM: 20, cuL: 25 },
      { name: 'Mattress — Full / Double',s: 55,  m: 70,  l: 95,             cuS: 22, cuM: 28, cuL: 35 },
      { name: 'Mattress — Queen',        s: 70,  m: 90,  l: 130,            cuS: 27, cuM: 35, cuL: 45 },
      { name: 'Mattress — King',         s: 100, m: 130, l: 180,            cuS: 35, cuM: 45, cuL: 55 },
      { name: 'Box spring — Twin',       s: 40,  m: 50,  l: 65,             cuS: 15, cuM: 20, cuL: 22 },
      { name: 'Box spring — Queen',      s: 55,  m: 75,  l: 95,             cuS: 25, cuM: 30, cuL: 35 },
      { name: 'Box spring — King',       s: 80,  m: 100, l: 130,            cuS: 35, cuM: 40, cuL: 45 },
      { name: 'Bed frame (metal)',       s: 25,  m: 45,  l: 70,             cuS: 8,  cuM: 12, cuL: 18 },
      { name: 'Headboard',               s: 20,  m: 45,  l: 80,  xl: 130,   cuS: 6,  cuM: 12, cuL: 20, cuXL: 30 },
      { name: 'Footboard',               s: 15,  m: 30,  l: 55,             cuS: 4,  cuM: 8,  cuL: 14 },
      { name: 'Dresser',                 s: 80,  m: 150, l: 240, xl: 350,   cuS: 20, cuM: 35, cuL: 55, cuXL: 80 },
      { name: 'Chest of drawers',        s: 60,  m: 110, l: 170,            cuS: 15, cuM: 25, cuL: 40 },
      { name: 'Nightstand',              s: 20,  m: 35,  l: 55,             cuS: 4,  cuM: 8,  cuL: 12 },
      { name: 'Armoire / Wardrobe',      s: 150, m: 250, l: 400, xl: 600,   cuS: 35, cuM: 55, cuL: 85, cuXL: 130 },
      { name: 'Vanity / Dressing table', s: 50,  m: 90,  l: 140,            cuS: 12, cuM: 22, cuL: 35 },
      { name: 'Cedar chest / Hope chest',s: 40,  m: 70,  l: 120,            cuS: 10, cuM: 18, cuL: 28 },
      { name: 'Full-length mirror',      s: 15,  m: 30,  l: 55,             cuS: 4,  cuM: 8,  cuL: 14 },
    ]
  },
  {
    id: 'dining', label: 'Dining', icon: 'utensils', color: '#ef4444',
    items: [
      { name: 'Dining table (4-seat)',   s: 60,  m: 100, l: 150,            cuS: 18, cuM: 28, cuL: 42 },
      { name: 'Dining table (6-seat)',   s: 100, m: 150, l: 220,            cuS: 28, cuM: 42, cuL: 60 },
      { name: 'Dining table (8+ seat)',  s: 180, m: 260, l: 350, xl: 500,   cuS: 50, cuM: 70, cuL: 95, cuXL: 130 },
      { name: 'Dining chair',            s: 10,  m: 18,  l: 30,             cuS: 3,  cuM: 5,  cuL: 8 },
      { name: 'Bar stool',               s: 12,  m: 20,  l: 32,             cuS: 4,  cuM: 6,  cuL: 9 },
      { name: 'Bench',                   s: 25,  m: 45,  l: 75,             cuS: 6,  cuM: 12, cuL: 20 },
      { name: 'Buffet / Sideboard',      s: 100, m: 180, l: 280, xl: 400,   cuS: 22, cuM: 40, cuL: 60, cuXL: 85 },
      { name: 'China cabinet / Hutch',   s: 150, m: 260, l: 380, xl: 550,   cuS: 35, cuM: 60, cuL: 85, cuXL: 120 },
      { name: 'Bar cart',                s: 25,  m: 40,  l: 65,             cuS: 8,  cuM: 12, cuL: 18 },
      { name: 'Wine rack',               s: 15,  m: 35,  l: 75,             cuS: 4,  cuM: 10, cuL: 20 },
    ]
  },
  {
    id: 'kitchen', label: 'Kitchen', icon: 'chef-hat', color: '#10b981',
    items: [
      { name: 'Microwave',               s: 25,  m: 40,  l: 60,             cuS: 6,  cuM: 10, cuL: 15 },
      { name: 'Coffee maker',            s: 5,   m: 10,  l: 18,             cuS: 2,  cuM: 3,  cuL: 5 },
      { name: 'Mixer (stand)',           s: 15,  m: 25,  l: 35,             cuS: 4,  cuM: 6,  cuL: 8 },
      { name: 'Toaster oven',            s: 8,   m: 15,  l: 25,             cuS: 2,  cuM: 4,  cuL: 6 },
      { name: 'Air fryer',               s: 8,   m: 14,  l: 22,             cuS: 2,  cuM: 4,  cuL: 6 },
      { name: 'Instant pot / Crock pot', s: 8,   m: 14,  l: 22,             cuS: 2,  cuM: 3,  cuL: 5 },
      { name: 'Kitchen island (rolling)',s: 60,  m: 110, l: 180,            cuS: 15, cuM: 25, cuL: 40 },
      { name: 'Bakers rack',             s: 35,  m: 65,  l: 100,            cuS: 10, cuM: 18, cuL: 28 },
      { name: 'Kitchen cart',            s: 30,  m: 55,  l: 85,             cuS: 8,  cuM: 14, cuL: 22 },
      { name: 'Trash can (kitchen)',     s: 5,   m: 12,  l: 20,             cuS: 3,  cuM: 6,  cuL: 10 },
    ]
  },
  {
    id: 'office', label: 'Office', icon: 'briefcase', color: '#3b82f6',
    items: [
      { name: 'Desk',                    s: 60,  m: 110, l: 180, xl: 280,   cuS: 18, cuM: 30, cuL: 50, cuXL: 75 },
      { name: 'Executive desk',          s: 150, m: 250, l: 380,            cuS: 40, cuM: 65, cuL: 100 },
      { name: 'Office chair',            s: 25,  m: 40,  l: 65,             cuS: 8,  cuM: 14, cuL: 22 },
      { name: 'Filing cabinet (2-drawer)',s: 45, m: 70,  l: 100,            cuS: 10, cuM: 16, cuL: 22 },
      { name: 'Filing cabinet (4-drawer)',s: 90, m: 140, l: 200,            cuS: 20, cuM: 32, cuL: 45 },
      { name: 'Bookshelf',               s: 40,  m: 80,  l: 140, xl: 200,   cuS: 14, cuM: 25, cuL: 40, cuXL: 60 },
      { name: 'Monitor',                 s: 10,  m: 18,  l: 30,             cuS: 3,  cuM: 5,  cuL: 8 },
      { name: 'Desktop computer / Tower',s: 15,  m: 25,  l: 40,             cuS: 4,  cuM: 6,  cuL: 10 },
      { name: 'Printer',                 s: 15,  m: 30,  l: 55,             cuS: 4,  cuM: 8,  cuL: 14 },
      { name: 'Copier / Large printer',  s: 80,  m: 150, l: 250, xl: 400,   cuS: 20, cuM: 40, cuL: 70, cuXL: 110 },
      { name: 'Safe (small/personal)',   s: 50,  m: 150, l: 350, xl: 800,   cuS: 8,  cuM: 20, cuL: 45, cuXL: 100 },
      { name: 'Conference table',        s: 150, m: 280, l: 450, xl: 700,   cuS: 40, cuM: 80, cuL: 125, cuXL: 180 },
      { name: 'Cubicle / Partition',     s: 80,  m: 150, l: 250,            cuS: 22, cuM: 40, cuL: 65 },
    ]
  },
  {
    id: 'appliances', label: 'Appliances', icon: 'bolt', color: '#6366f1',
    items: [
      { name: 'Refrigerator',            s: 180, m: 280, l: 380, xl: 500,   cuS: 30, cuM: 45, cuL: 60, cuXL: 80 },
      { name: 'Chest freezer',           s: 120, m: 200, l: 320,            cuS: 20, cuM: 32, cuL: 50 },
      { name: 'Upright freezer',         s: 150, m: 230, l: 320,            cuS: 22, cuM: 35, cuL: 50 },
      { name: 'Washing machine',         s: 160, m: 200, l: 260,            cuS: 22, cuM: 28, cuL: 35 },
      { name: 'Dryer',                   s: 100, m: 130, l: 170,            cuS: 18, cuM: 22, cuL: 30 },
      { name: 'Stackable washer+dryer',  s: 280, m: 350, l: 430,            cuS: 45, cuM: 55, cuL: 70 },
      { name: 'Dishwasher',              s: 70,  m: 90,  l: 120,            cuS: 12, cuM: 15, cuL: 20 },
      { name: 'Stove / Range (gas)',     s: 140, m: 180, l: 230,            cuS: 22, cuM: 28, cuL: 35 },
      { name: 'Stove / Range (electric)',s: 130, m: 160, l: 200,            cuS: 20, cuM: 25, cuL: 32 },
      { name: 'Wall oven',               s: 100, m: 150, l: 220,            cuS: 15, cuM: 22, cuL: 32 },
      { name: 'Window A/C unit',         s: 40,  m: 80,  l: 130,            cuS: 6,  cuM: 12, cuL: 20 },
      { name: 'Portable A/C / Heater',   s: 35,  m: 60,  l: 90,             cuS: 6,  cuM: 10, cuL: 14 },
      { name: 'Water cooler / Dispenser',s: 30,  m: 55,  l: 80,             cuS: 5,  cuM: 9,  cuL: 14 },
    ]
  },
  {
    id: 'gym', label: 'Gym Equipment', icon: 'flame', color: '#dc2626',
    items: [
      { name: 'Treadmill',               s: 180, m: 260, l: 350, xl: 450,   cuS: 35, cuM: 50, cuL: 70, cuXL: 95 },
      { name: 'Elliptical',              s: 150, m: 220, l: 300,            cuS: 30, cuM: 42, cuL: 60 },
      { name: 'Stationary bike',         s: 60,  m: 100, l: 160,            cuS: 12, cuM: 20, cuL: 32 },
      { name: 'Spin bike / Peloton',     s: 100, m: 135, l: 170,            cuS: 18, cuM: 24, cuL: 32 },
      { name: 'Rowing machine',          s: 50,  m: 80,  l: 120,            cuS: 10, cuM: 16, cuL: 24 },
      { name: 'Weight bench',            s: 40,  m: 75,  l: 120,            cuS: 8,  cuM: 14, cuL: 22 },
      { name: 'Power rack / Squat cage', s: 180, m: 280, l: 400, xl: 550,   cuS: 35, cuM: 55, cuL: 80, cuXL: 110 },
      { name: 'Multi-gym / Home gym',    s: 250, m: 400, l: 550, xl: 750,   cuS: 50, cuM: 80, cuL: 110, cuXL: 150 },
      { name: 'Dumbbell set',            s: 50,  m: 150, l: 300, xl: 500,   cuS: 4,  cuM: 10, cuL: 20, cuXL: 35 },
      { name: 'Olympic barbell + plates',s: 150, m: 300, l: 500,            cuS: 12, cuM: 20, cuL: 35 },
      { name: 'Kettlebell (each)',       s: 15,  m: 30,  l: 55,             cuS: 1,  cuM: 2,  cuL: 4 },
      { name: 'Yoga mat / Accessories',  s: 3,   m: 8,   l: 15,             cuS: 1,  cuM: 2,  cuL: 4 },
      { name: 'Foam roller / Small gear',s: 3,   m: 8,   l: 15,             cuS: 1,  cuM: 2,  cuL: 4 },
    ]
  },
  {
    id: 'outdoor', label: 'Outdoor / Yard', icon: 'tree', color: '#16a34a',
    items: [
      { name: 'Gas grill',               s: 80,  m: 130, l: 200, xl: 280,   cuS: 15, cuM: 25, cuL: 40, cuXL: 60 },
      { name: 'Charcoal grill / Smoker', s: 40,  m: 90,  l: 180, xl: 300,   cuS: 8,  cuM: 18, cuL: 35, cuXL: 60 },
      { name: 'Patio table',             s: 40,  m: 80,  l: 140,            cuS: 8,  cuM: 15, cuL: 25 },
      { name: 'Patio chair',             s: 15,  m: 30,  l: 55,             cuS: 4,  cuM: 6,  cuL: 9 },
      { name: 'Patio set (4-6 piece)',   s: 120, m: 220, l: 340,            cuS: 22, cuM: 40, cuL: 60 },
      { name: 'Outdoor umbrella',        s: 20,  m: 35,  l: 60,             cuS: 4,  cuM: 8,  cuL: 12 },
      { name: 'Chiminea / Fire pit',     s: 40,  m: 90,  l: 160,            cuS: 8,  cuM: 18, cuL: 30 },
      { name: 'Lawn mower (push)',       s: 50,  m: 80,  l: 120,            cuS: 10, cuM: 14, cuL: 22 },
      { name: 'Lawn mower (riding)',     s: 300, m: 450, l: 600, xl: 800,   cuS: 55, cuM: 80, cuL: 110, cuXL: 150 },
      { name: 'Leaf blower / Trimmer',   s: 8,   m: 15,  l: 25,             cuS: 2,  cuM: 3,  cuL: 5 },
      { name: 'Garden tools (bundle)',   s: 15,  m: 35,  l: 65,             cuS: 3,  cuM: 6,  cuL: 12 },
      { name: 'Wheelbarrow',             s: 25,  m: 45,  l: 70,             cuS: 8,  cuM: 12, cuL: 18 },
      { name: 'Ladder',                  s: 15,  m: 35,  l: 65,             cuS: 4,  cuM: 8,  cuL: 14 },
      { name: 'Hose reel',               s: 10,  m: 20,  l: 35,             cuS: 2,  cuM: 4,  cuL: 8 },
      { name: 'Planter / Pot (each)',    s: 8,   m: 25,  l: 70,             cuS: 2,  cuM: 5,  cuL: 14 },
    ]
  },
  {
    id: 'odd', label: 'Odd & Bulky', icon: 'piano', color: '#f97316',
    items: [
      { name: 'Piano — Upright',         s: 400, m: 600, l: 800, xl: 1000,  cuS: 55, cuM: 75, cuL: 95, cuXL: 120 },
      { name: 'Piano — Grand',           s: 550, m: 800, l: 1000, xl: 1400, cuS: 80, cuM: 110, cuL: 140, cuXL: 180 },
      { name: 'Piano — Spinet / Console',s: 300, m: 400, l: 500,            cuS: 40, cuM: 55, cuL: 70 },
      { name: 'Safe (gun safe)',         s: 200, m: 500, l: 900, xl: 1500,  cuS: 22, cuM: 50, cuL: 85, cuXL: 140 },
      { name: 'Pool table',              s: 500, m: 750, l: 1000,           cuS: 70, cuM: 100, cuL: 130 },
      { name: 'Hot tub (empty)',         s: 400, m: 700, l: 900, xl: 1200,  cuS: 70, cuM: 110, cuL: 140, cuXL: 180 },
      { name: 'Basketball goal',         s: 150, m: 250, l: 350, xl: 500,   cuS: 22, cuM: 35, cuL: 50, cuXL: 70 },
      { name: 'Trampoline',              s: 100, m: 180, l: 280,            cuS: 22, cuM: 40, cuL: 60 },
      { name: 'Canoe',                   s: 45,  m: 70,  l: 95,              cuS: 18, cuM: 28, cuL: 40 },
      { name: 'Kayak',                   s: 30,  m: 50,  l: 80,              cuS: 12, cuM: 20, cuL: 30 },
      { name: 'Paddle board',            s: 15,  m: 25,  l: 40,              cuS: 8,  cuM: 14, cuL: 22 },
      { name: 'Bicycle',                 s: 20,  m: 30,  l: 45,              cuS: 8,  cuM: 12, cuL: 18 },
      { name: 'E-bike / Scooter',        s: 40,  m: 65,  l: 95,              cuS: 10, cuM: 15, cuL: 22 },
      { name: 'Motorcycle',              s: 300, m: 500, l: 700, xl: 900,    cuS: 35, cuM: 55, cuL: 80, cuXL: 110 },
      { name: 'Snow blower',             s: 80,  m: 140, l: 220,             cuS: 12, cuM: 20, cuL: 30 },
      { name: 'Golf cart',               s: 500, m: 700, l: 900,             cuS: 70, cuM: 100, cuL: 130 },
      { name: 'Ping pong table',         s: 140, m: 200, l: 280,             cuS: 22, cuM: 32, cuL: 42 },
      { name: 'Foosball table',          s: 100, m: 160, l: 220,             cuS: 18, cuM: 28, cuL: 40 },
      { name: 'Arcade / Pinball',        s: 200, m: 300, l: 450,             cuS: 30, cuM: 45, cuL: 65 },
      { name: 'Taxidermy mount',         s: 15,  m: 45,  l: 120,             cuS: 4,  cuM: 12, cuL: 30 },
    ]
  },
  {
    id: 'boxes', label: 'Boxes', icon: 'box', color: '#14C6BF',
    items: [
      // Boxes have FIXED cubic footage by box type — printed on the carton.
      // Weight varies by contents but here are conservative averages used
      // by the moving industry for surveys.
      { name: 'Small box (1.5 cu ft)',       s: 25,  m: 35,  l: 45,         cuS: 1.5, cuM: 1.5, cuL: 1.5 },
      { name: 'Medium box (3 cu ft)',        s: 35,  m: 50,  l: 65,         cuS: 3.0, cuM: 3.0, cuL: 3.0 },
      { name: 'Large box (4.5 cu ft)',       s: 45,  m: 60,  l: 80,         cuS: 4.5, cuM: 4.5, cuL: 4.5 },
      { name: 'X-large box (6 cu ft)',       s: 60,  m: 80,  l: 100,        cuS: 6.0, cuM: 6.0, cuL: 6.0 },
      { name: 'Wardrobe box',                s: 30,  m: 50,  l: 70,         cuS: 13,  cuM: 13,  cuL: 13 },
      { name: 'Dish pack / China barrel',    s: 55,  m: 75,  l: 95,         cuS: 5.0, cuM: 5.0, cuL: 5.0 },
      { name: 'Book box (reinforced)',       s: 45,  m: 60,  l: 75,         cuS: 1.5, cuM: 1.5, cuL: 1.5 },
      { name: 'Picture / Mirror carton',     s: 20,  m: 35,  l: 55,         cuS: 4.0, cuM: 4.0, cuL: 4.0 },
      { name: 'TV carton',                   s: 35,  m: 55,  l: 80,         cuS: 6,   cuM: 8,   cuL: 12 },
      { name: 'Tote / Rubbermaid bin',       s: 20,  m: 35,  l: 55,         cuS: 1.5, cuM: 2.5, cuL: 4 },
      { name: 'Suitcase (packed)',           s: 30,  m: 45,  l: 65,         cuS: 2,   cuM: 3,   cuL: 5 },
      { name: 'Duffle bag / Large bag',      s: 15,  m: 30,  l: 50,         cuS: 1,   cuM: 2,   cuL: 4 },
    ]
  },
  {
    id: 'misc', label: 'Other / Misc', icon: 'help', color: '#64748b',
    items: [
      { name: 'Tool chest / Toolbox',    s: 50,  m: 120, l: 250, xl: 450,   cuS: 12, cuM: 22, cuL: 40, cuXL: 70 },
      { name: 'Shelving unit (metal)',   s: 35,  m: 70,  l: 120,            cuS: 15, cuM: 25, cuL: 40 },
      { name: 'Fish tank / Aquarium (empty)', s: 25, m: 55, l: 100, xl: 200,cuS: 8,  cuM: 18, cuL: 32, cuXL: 60 },
      { name: 'Pet crate / Kennel',      s: 15,  m: 30,  l: 60,             cuS: 4,  cuM: 8,  cuL: 15 },
      { name: 'Christmas tree (boxed)',  s: 25,  m: 45,  l: 75,             cuS: 8,  cuM: 12, cuL: 18 },
      { name: 'Holiday decor (boxed)',   s: 15,  m: 30,  l: 55,             cuS: 4,  cuM: 8,  cuL: 14 },
      { name: 'Guitar / Instrument',     s: 8,   m: 20,  l: 40,             cuS: 4,  cuM: 8,  cuL: 14 },
      { name: 'Amplifier / Speaker',     s: 20,  m: 50,  l: 120,            cuS: 4,  cuM: 10, cuL: 22 },
      { name: 'Vacuum cleaner',          s: 15,  m: 25,  l: 40,             cuS: 4,  cuM: 6,  cuL: 10 },
      { name: 'Iron board',              s: 10,  m: 15,  l: 25,             cuS: 4,  cuM: 6,  cuL: 8 },
      { name: 'Art / Painting (framed)', s: 10,  m: 30,  l: 70,  xl: 140,   cuS: 3,  cuM: 8,  cuL: 18, cuXL: 35 },
      { name: 'Sculpture / Statue',      s: 25,  m: 75,  l: 200, xl: 500,   cuS: 4,  cuM: 12, cuL: 30, cuXL: 80 },
    ]
  },
];

// Flatten for search
const ALL_INVENTORY_ITEMS = INVENTORY_CATEGORIES.flatMap(cat =>
  cat.items.map(item => ({ ...item, categoryId: cat.id, categoryLabel: cat.label, categoryIcon: cat.icon }))
);

// Size labels — XL only shown when item supports it
const SIZE_LABELS = { s: 'Small', m: 'Medium', l: 'Large', xl: 'X-Large' };

// ─── CREW PRODUCTIVITY CONSTANTS ──────────────────────────────
// lbs moved per mover per hour. Calibrated to MaxAMove reality, not industry generic.
// FLAT per-mover rate: combined throughput = rate × number of movers.
//   2-man crew = 382 × 2 = 764 lbs/hr
//   3-man crew = 382 × 3 = 1146 lbs/hr
//   4-man crew = 382 × 4 = 1528 lbs/hr
// As individual crew members get assigned to jobs and complete them, the system
// will learn each member's actual rate and use sums of those instead of this generic default.
const CREW_PRODUCTIVITY = {
  2: 382,
  3: 382,
  4: 382,
};

// Default lbs/hr/mover for a brand-new crew member with no completed-move data yet.
// Calibrated 2026-04-26 from MaxAMove's first real estimate (Angel Aaron):
//   2103 lbs ÷ ((2.25 system + 3.25 manual) / 2 hrs × 2 movers) = 382 lbs/hr/mover
// As real job-complete data accumulates, each member's individual rate will refine itself.
const DEFAULT_LBS_PER_HOUR_PER_MOVER = 382;

// ─── DEFAULT TRUCK SIZE PRESETS ──────────────────────────────────
// Cubic footage values are typical interior cargo capacity (manufacturer specs +
// industry consensus). Weight limits are typical GVWR-derived payload capacity.
// These are seed defaults — each truck record can be customized in Settings.
const DEFAULT_TRUCK_PRESETS = [
  { id: 'cargo_van',  label: 'Cargo Van',      capacityCuft: 250,  capacityLbs: 3000 },
  { id: '10ft',       label: '10 ft Truck',    capacityCuft: 380,  capacityLbs: 3500 },
  { id: '12ft',       label: '12 ft Truck',    capacityCuft: 450,  capacityLbs: 3800 },
  { id: '14ft',       label: '14 ft Truck',    capacityCuft: 700,  capacityLbs: 6000 },
  { id: '16ft',       label: '16 ft Truck',    capacityCuft: 800,  capacityLbs: 7500 },
  { id: '18ft',       label: '18 ft Truck',    capacityCuft: 900,  capacityLbs: 8500 },
  { id: '20ft',       label: '20 ft Truck',    capacityCuft: 1000, capacityLbs: 9000 },
  { id: '22ft',       label: '22 ft Truck',    capacityCuft: 1200, capacityLbs: 10000 },
  { id: '24ft',       label: '24 ft Truck',    capacityCuft: 1300, capacityLbs: 11000 },
  { id: '26ft',       label: '26 ft Truck',    capacityCuft: 1400, capacityLbs: 12000 },
  { id: '28ft',       label: '28 ft Truck',    capacityCuft: 1500, capacityLbs: 13000 },
  { id: 'trailer53',  label: '53 ft Trailer',  capacityCuft: 3800, capacityLbs: 45000 },
];

// ─── INVENTORY CALCULATORS ───────────────────────────────────────

// Weight (lbs) of a single inventory entry — used by estimate preview to render per-item weight
function getItemWeight(entry) {
  const item = ALL_INVENTORY_ITEMS.find(i => i.name === entry.name && i.categoryId === entry.categoryId);
  return item ? (item[entry.size || 'm'] || item.m || 0) : 0;
}

// Total weight (lbs) of an inventory list
function calcInventoryWeight(inventory) {
  if (!Array.isArray(inventory)) return 0;
  return inventory.reduce((sum, entry) => {
    const item = ALL_INVENTORY_ITEMS.find(i => i.name === entry.name && i.categoryId === entry.categoryId);
    if (!item) return sum;
    const weight = item[entry.size || 'm'] || item.m || 0;
    return sum + (weight * (entry.qty || 1));
  }, 0);
}

// Total cubic feet of an inventory list
function calcInventoryCubicFeet(inventory) {
  if (!Array.isArray(inventory)) return 0;
  return inventory.reduce((sum, entry) => {
    const item = ALL_INVENTORY_ITEMS.find(i => i.name === entry.name && i.categoryId === entry.categoryId);
    if (!item) return sum;
    const sizeKey = (entry.size || 'm').toUpperCase();   // 'S', 'M', 'L', 'XL'
    const cuKey = 'cu' + sizeKey;                         // 'cuS', 'cuM', 'cuL', 'cuXL'
    const cu = item[cuKey] != null ? item[cuKey] : (item.cuM || 0);
    return sum + (cu * (entry.qty || 1));
  }, 0);
}

// Estimate labor hours from weight.
// extraFactors.crewThroughput, if provided, OVERRIDES the generic CREW_PRODUCTIVITY
// table — used when a specific crew is assigned (sum of each member's effective lbs/hr rate).
function estimateLaborHours(totalWeight, crewSize = 2, extraFactors = {}) {
  const perHour = (extraFactors.crewThroughput && extraFactors.crewThroughput > 0)
    ? extraFactors.crewThroughput
    : (CREW_PRODUCTIVITY[crewSize] || CREW_PRODUCTIVITY[2]) * crewSize;
  if (perHour === 0) return 0;
  let hours = totalWeight / perHour;
  if (extraFactors.stairs) hours *= 1.15;
  if (extraFactors.longCarry) hours *= 1.10;
  if (extraFactors.packing === 'full') hours *= 1.8;
  if (extraFactors.packing === 'partial') hours *= 1.3;
  return Math.max(2, Math.round(hours * 4) / 4); // round to 0.25hr
}

// Given total cubic feet needed and a list of available trucks (each with capacityCuft),
// returns: { fits: bestSingleTruckThatFits, smallest: smallestThatFits, exceeds: arrayOfTooSmall }
//   - fits: the smallest single truck that has capacity >= total; null if none do
//   - exceeds: trucks whose capacity is less than totalCuft
//   - utilization: 0..1 fill ratio for the chosen `fits` truck
function suggestTruckForCubicFeet(totalCuft, trucks) {
  if (!Array.isArray(trucks) || trucks.length === 0) return { fits: null, smallest: null, exceeds: [], utilization: 0 };
  const sorted = [...trucks].filter(t => t.capacityCuft || t.capacity_cuft).sort((a, b) =>
    (a.capacityCuft || a.capacity_cuft) - (b.capacityCuft || b.capacity_cuft)
  );
  const exceeds = sorted.filter(t => (t.capacityCuft || t.capacity_cuft) < totalCuft);
  const fits = sorted.find(t => (t.capacityCuft || t.capacity_cuft) >= totalCuft) || null;
  const utilization = fits ? totalCuft / (fits.capacityCuft || fits.capacity_cuft) : 0;
  return { fits, smallest: sorted[0] || null, exceeds, utilization };
}

Object.assign(window, {
  INVENTORY_CATEGORIES, ALL_INVENTORY_ITEMS, SIZE_LABELS,
  CREW_PRODUCTIVITY, DEFAULT_LBS_PER_HOUR_PER_MOVER, DEFAULT_TRUCK_PRESETS,
  getItemWeight, calcInventoryWeight, calcInventoryCubicFeet, estimateLaborHours,
  suggestTruckForCubicFeet,
});
