// Persisted admin data (localStorage) — production batches, inventory, usage log, daily expenses.
(function ghAdminStore() {
  const KB = 'gh_batches_v1';
  const KI = 'gh_inventory_v1';
  const KUSAGE = 'gh_usage_log_v1';
  const KEXP = 'gh_daily_expenses_v1';
  const KE = 'gh_employees_v1';

  function notify() {
    try { window.dispatchEvent(new CustomEvent('gh-admin-data')); } catch (e) { /* */ }
  }
  window.__notifyAdminData = notify;

  function mergeBatchesFromLS() {
    const seed = window.__BATCHES_SEED || [];
    let user = [];
    try { user = JSON.parse(localStorage.getItem(KB) || '[]'); } catch (e) { /* */ }
    if (!Array.isArray(user)) user = [];
    const seen = new Set();
    const out = [];
    for (let i = 0; i < user.length; i++) {
      const b = user[i];
      if (b && b.id && !seen.has(b.id)) { seen.add(b.id); out.push(b); }
    }
    for (let i = 0; i < seed.length; i++) {
      const b = seed[i];
      if (b && b.id && !seen.has(b.id)) { seen.add(b.id); out.push(b); }
    }
    out.sort((a, b) => ((b.batch_date || '').localeCompare(a.batch_date || '')) || String(b.id).localeCompare(String(a.id)));
    window.BATCHES = out;
  }

  try {
    const raw = localStorage.getItem(KI);
    if (raw) {
      const arr = JSON.parse(raw);
      if (Array.isArray(arr) && arr.length) window.INVENTORY = arr;
    }
  } catch (e) { /* */ }

  mergeBatchesFromLS();

  function hydrateEmployees() {
    var base = window.__EMPLOYEES_BASE;
    if (!base || !base.length) return;
    var extra = {};
    try {
      extra = JSON.parse(localStorage.getItem(KE) || '{}');
    } catch (e) {
      extra = {};
    }
    window.EMPLOYEES = base.map(function (e) {
      var p = extra[e.id] || {};
      return Object.assign({}, e, p);
    });
  }
  hydrateEmployees();

  window.__hydrateEmployees = hydrateEmployees;

  window.__saveEmployeePatch = function (id, patch) {
    var extra = {};
    try {
      extra = JSON.parse(localStorage.getItem(KE) || '{}');
    } catch (e) {
      extra = {};
    }
    extra[id] = Object.assign({}, extra[id] || {}, patch);
    try {
      localStorage.setItem(KE, JSON.stringify(extra));
    } catch (e) { /* */ }
    hydrateEmployees();
    notify();
  };

  window.__addProductionBatch = function (batch) {
    let user = [];
    try { user = JSON.parse(localStorage.getItem(KB) || '[]'); } catch (e) { /* */ }
    if (!Array.isArray(user)) user = [];
    user.unshift(batch);
    try { localStorage.setItem(KB, JSON.stringify(user)); } catch (e) { /* */ }
    mergeBatchesFromLS();
    notify();
  };

  window.__saveInventorySnapshot = function (inv) {
    window.INVENTORY = inv;
    try {
      localStorage.setItem(KI, JSON.stringify(inv));
    } catch (e) { /* */ }
    notify();
  };

  window.__appendUsageLogEntry = function (entry) {
    let logs = [];
    try {
      logs = JSON.parse(localStorage.getItem(KUSAGE) || '[]');
    } catch (e) { /* */ }
    if (!Array.isArray(logs)) logs = [];
    logs.unshift(entry);
    try {
      localStorage.setItem(KUSAGE, JSON.stringify(logs.slice(0, 500)));
    } catch (e) { /* */ }
    notify();
  };

  window.__getUsageLog = function () {
    try {
      const logs = JSON.parse(localStorage.getItem(KUSAGE) || '[]');
      return Array.isArray(logs) ? logs : [];
    } catch (e) {
      return [];
    }
  };

  /** { [isoDate]: { [locationId]: payload } } */
  window.__getDailyExpensesMap = function () {
    try {
      const o = JSON.parse(localStorage.getItem(KEXP) || '{}');
      return o && typeof o === 'object' ? o : {};
    } catch (e) {
      return {};
    }
  };

  window.__saveDailyExpensesMap = function (map) {
    try {
      localStorage.setItem(KEXP, JSON.stringify(map));
    } catch (e) { /* */ }
    notify();
  };
})();
