// ===== Auftragsanalyse — Datensatz =====
// Laufende Aufträge stammen aus der Feinplanung (window.ORDERS), ergänzt um ~100
// bereits abgeschlossene (fertiggemeldete) Aufträge. Alle Kennzahlen werden
// nachvollziehbar aus Plan-/Ist-Terminen berechnet.

function aoRng(seed) {
  return function () { seed |= 0; seed = (seed + 0x6D2B79F5) | 0; let t = Math.imul(seed ^ (seed >>> 15), 1 | seed); t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t; return ((t ^ (t >>> 14)) >>> 0) / 4294967296; };
}
const AO_DAY = 86400000;
const aoIso = (d) => d.toISOString().slice(0, 10);
const aoDe2 = (s) => { if (!s) return '—'; const d = new Date(s + 'T00:00:00Z'); return `${String(d.getUTCDate()).padStart(2,'0')}.${String(d.getUTCMonth()+1).padStart(2,'0')}.${d.getUTCFullYear()}`; };
const AO_TODAY = new Date('2026-06-12T00:00:00Z');

// Arbeitsstunden → Arbeitstage (8h/Schicht, Annahme 1 Schicht-Arbeitsinhalt ~ Tagesbezug)
const wsName = (id) => (window.WORK_SYSTEMS.find(w => w.id === id) || {}).name || id;

// 1) Laufende Aufträge aus der Feinplanung
function runningFromFeinplanung() {
  const SHIFT = window.SHIFT_HOURS || 8;
  return window.ORDERS.map(o => {
    const planStart = window.dateFromH(o.planStart);
    const planEnde = window.dateFromH(o.planEnde);
    // Ist-Start: freigegebene/in Arbeit befindliche Aufträge sind bereits gestartet
    const started = o.released || o.bestand === 'direkt' || o.bestand === 'indirekt';
    const istStartH = started ? o.planStart - Math.round((o.planStart % 3 + 3)) : null;
    const istStart = started ? window.dateFromH(istStartH != null ? istStartH : o.planStart) : null;
    const planDLZ = Math.max(1, Math.round((o.planEnde - o.planStart) / 24));
    const taZugang = istStart ? Math.round((istStart - planStart) / AO_DAY) : null;
    const istArbeit = Math.round((o.restGesamtH || o.dauerH) * 10) / 10;
    const planArbeit = Math.round((o.restGesamtH || o.dauerH) * 0.95 * 10) / 10;
    const abc = (window.CUSTOMERS && window.CUSTOMERS[o.kunde]) || 'C';
    const score = (window.computeScore ? window.computeScore(o, window.DEFAULT_WEIGHTS, window.DEFAULT_KUNDE_MAP).total : 5);
    return {
      nr: o.nr, bez: o.kurz, produkt: o.kurz.split(' ')[0], kunde: o.kunde, abc, score, system: wsName(o.drehWs || 'WS-DZ-04'),
      planStart: aoIso(planStart), istStart: istStart ? aoIso(istStart) : null,
      planEnde: aoIso(planEnde), istEnde: null,
      istDLZ: planDLZ, planDLZ, taZugang, taRel: null, taAbgang: null,
      planArbeit, istArbeit, status: 'Laufend',
    };
  });
}

// 2) ~100 abgeschlossene Aufträge (historisch, fertiggemeldet)
function completedOrders() {
  const rng = aoRng(424242);
  const gauss = () => (rng() + rng() + rng() + rng() - 2) / 1.5;
  const produkte = window.A_PRODUKTE || ['Antriebswelle', 'Lagerbock', 'Düsenkörper', 'Ventilsitz', 'Gehäuseflansch', 'Adapterflansch', 'Turbinenfuß', 'Kolbenstange'];
  const kunden = window.A_KUNDEN || Object.keys(window.CUSTOMERS || {});
  const systeme = (window.WORK_SYSTEMS || []).map(w => w.name);
  const start = new Date(AO_TODAY.getTime() - 540 * AO_DAY);
  const rows = [];
  let nr = 10100;
  for (let i = 0; i < 100; i++) {
    nr += 1 + Math.floor(rng() * 4);
    const produkt = produkte[Math.floor(rng() * produkte.length)];
    const kunde = kunden[Math.floor(rng() * kunden.length)];
    const system = systeme[Math.floor(rng() * systeme.length)] || 'Drehzentrum CTX 4';
    const planStart = new Date(start.getTime() + rng() * 470 * AO_DAY);
    const planDLZ = Math.max(2, Math.round(6 + Math.abs(gauss()) * 16));
    const planEnde = new Date(planStart.getTime() + planDLZ * AO_DAY);
    const taZugang = Math.round(gauss() * 7 - 3);
    const istStart = new Date(planStart.getTime() + taZugang * AO_DAY);
    const istDLZ = Math.max(1, Math.round(planDLZ * (1 + gauss() * 0.3)));
    const istEnde = new Date(istStart.getTime() + istDLZ * AO_DAY);
    const taAbgang = Math.round((istEnde - planEnde) / AO_DAY);
    const taRel = taAbgang - taZugang;
    const planArbeit = Math.round((4 + Math.abs(gauss()) * 34) * 100) / 100;
    const istArbeit = Math.round(planArbeit * (1 + gauss() * 0.22) * 100) / 100;
    const abc = (window.CUSTOMERS && window.CUSTOMERS[kunde]) || ['A', 'B', 'C'][Math.floor(rng() * 3)];
    const score = Math.max(1, Math.min(9, Math.round(({ A: 7, B: 5, C: 3 }[abc] || 4) + gauss() * 1.6)));
    rows.push({
      nr: 'FA-' + nr, bez: `${produkt}_${String(1 + Math.floor(rng() * 40)).padStart(3, '0')}`,
      produkt, kunde, abc, score, system,
      planStart: aoIso(planStart), istStart: aoIso(istStart), planEnde: aoIso(planEnde), istEnde: aoIso(istEnde),
      istDLZ, planDLZ, taZugang, taRel, taAbgang, planArbeit, istArbeit, status: 'Fertiggemeldet',
    });
  }
  return rows;
}

// 2b) Kürzlich fertiggemeldete Aufträge (letzte 4 Wochen), gleichmäßig auf alle Systeme
// verteilt — damit Leistung & Reichweite im Nahbereich belastbar sind.
function recentCompleted() {
  const rng = aoRng(909090);
  const gauss = () => (rng() + rng() + rng() + rng() - 2) / 1.5;
  const produkte = window.A_PRODUKTE || ['Antriebswelle', 'Lagerbock', 'Düsenkörper'];
  const kunden = window.A_KUNDEN || Object.keys(window.CUSTOMERS || {});
  const systeme = (window.WORK_SYSTEMS || []).map(w => w.name);
  const rows = [];
  let nr = 10250;
  systeme.forEach(system => {
    const nPerSys = 7 + Math.floor(rng() * 4); // 7–10 je System in 4 Wochen
    for (let i = 0; i < nPerSys; i++) {
      nr += 1 + Math.floor(rng() * 3);
      const produkt = produkte[Math.floor(rng() * produkte.length)];
      const kunde = kunden[Math.floor(rng() * kunden.length)];
      // Ist-Ende innerhalb der letzten 27 Tage
      const istEnde = new Date(AO_TODAY.getTime() - (1 + Math.floor(rng() * 27)) * AO_DAY);
      const planDLZ = Math.max(2, Math.round(5 + Math.abs(gauss()) * 12));
      const istDLZ = Math.max(1, Math.round(planDLZ * (1 + gauss() * 0.25)));
      const istStart = new Date(istEnde.getTime() - istDLZ * AO_DAY);
      const taZugang = Math.round(gauss() * 5 - 2);
      const planStart = new Date(istStart.getTime() - taZugang * AO_DAY);
      const planEnde = new Date(planStart.getTime() + planDLZ * AO_DAY);
      const taAbgang = Math.round((istEnde - planEnde) / AO_DAY);
      const planArbeit = Math.round((4 + Math.abs(gauss()) * 30) * 100) / 100;
      const istArbeit = Math.round(planArbeit * (1 + gauss() * 0.2) * 100) / 100;
      const abc = (window.CUSTOMERS && window.CUSTOMERS[kunde]) || ['A', 'B', 'C'][Math.floor(rng() * 3)];
      const score = Math.max(1, Math.min(9, Math.round(({ A: 7, B: 5, C: 3 }[abc] || 4) + gauss() * 1.6)));
      rows.push({
        nr: 'FA-' + nr, bez: `${produkt}_${String(1 + Math.floor(rng() * 40)).padStart(3, '0')}`,
        produkt, kunde, abc, score, system,
        planStart: aoIso(planStart), istStart: aoIso(istStart), planEnde: aoIso(planEnde), istEnde: aoIso(istEnde),
        istDLZ, planDLZ, taZugang, taRel: taAbgang - taZugang, taAbgang, planArbeit, istArbeit, status: 'Fertiggemeldet',
      });
    }
  });
  return rows;
}

// Produkt-/Kunden-/Systemlisten (Fallback, falls Feinplanung später lädt)
const A_PRODUKTE = ['Antriebswelle', 'Lagerbock', 'Düsenkörper', 'Ventilsitz', 'Gehäuseflansch', 'Adapterflansch', 'Turbinenfuß', 'Kolbenstange', 'Strukturhalter', 'Kupplungsnabe'];
const A_KUNDEN = Object.keys(window.CUSTOMERS || {});
const A_SYSTEME = (window.WORK_SYSTEMS || []).map(w => w.name);

const A_ORDERS = [...runningFromFeinplanung(), ...completedOrders(), ...recentCompleted()];

Object.assign(window, { A_ORDERS, A_PRODUKTE, A_KUNDEN, A_SYSTEME, aDe: aoDe2, aIso: aoIso });
