// ProgramStore — CIO-level portfolio of modernization programs
// Seeded standalone (P1). In P3 this will read live state from LzStore/DcxStore/etc.

(function () {
  const listeners = new Set();

  // ============ Programs (portfolio rows) ============
  // $M = millions USD, annualized where applicable
  const SEED_PROGRAMS = [
    {
      id: 'dcx', name: 'Data center exit', sub: 'mainframe + 4 DCs → AWS',
      rag: 'amber', pctComplete: 22,
      bookedM: 0.0, forecastM: 28.4,
      owner: 'VP Infrastructure',
      milestone: 'Wave 2 kickoff',
      milestoneDate: '2026-06-15',
      drillTo: 'cap-data-center-exit.html',
    },
    {
      id: 'finops', name: 'Cloud cost & FinOps', sub: 'unit-economics · showback',
      rag: 'green', pctComplete: 64,
      bookedM: 4.1, forecastM: 6.8,
      owner: 'Head of FinOps',
      milestone: 'Savings plan renewal',
      milestoneDate: '2026-07-01',
      drillTo: 'cap-cloud-finops.html',
    },
    {
      id: 'landing', name: 'Cloud landing zones', sub: 'Control Tower · 6 accounts',
      rag: 'green', pctComplete: 88,
      bookedM: 0.0, forecastM: 1.2,
      owner: 'Principal Cloud Arch',
      milestone: 'fraud-prod live',
      milestoneDate: '2026-05-02',
      drillTo: 'cap-landing-zones.html',
    },
    {
      id: 'k8s', name: 'Container modernization', sub: 'EKS + mesh · 12 workloads',
      rag: 'amber', pctComplete: 54,
      bookedM: 1.8, forecastM: 3.6,
      owner: 'SRE Lead',
      milestone: 'mTLS strict cluster-wide',
      milestoneDate: '2026-05-20',
      drillTo: 'cap-container-modernization.html',
    },
    {
      id: 'cicd', name: 'CI/CD modernization', sub: 'SLSA-3 · signed supply chain',
      rag: 'green', pctComplete: 71,
      bookedM: 0.0, forecastM: 2.1,
      owner: 'Platform Eng Mgr',
      milestone: 'analytics-api signing',
      milestoneDate: '2026-05-10',
      drillTo: 'cap-cicd-modernization.html',
    },
    {
      id: 'sec', name: 'Security automation', sub: 'posture · evidence · SOC2',
      rag: 'red', pctComplete: 38,
      bookedM: 0.0, forecastM: 3.2,
      owner: 'CISO',
      milestone: 'Close criticals',
      milestoneDate: '2026-04-30',
      drillTo: 'cap-security-automation.html',
    },
    {
      id: 'obs', name: 'Observability & SRE', sub: 'SLOs · burn rate · error budget',
      rag: 'amber', pctComplete: 47,
      bookedM: 0.0, forecastM: 1.4,
      owner: 'SRE Lead',
      milestone: 'SLO v2 rollout',
      milestoneDate: '2026-06-01',
      drillTo: 'cap-observability-sre.html',
    },
    {
      id: 'dx', name: 'Developer platforms', sub: 'Backstage · golden paths · IDP',
      rag: 'green', pctComplete: 59,
      bookedM: 0.0, forecastM: 4.5,
      owner: 'Head of Platform Eng',
      milestone: '15 services on path',
      milestoneDate: '2026-05-25',
      drillTo: 'cap-developer-experience.html',
    },
  ];

  // ============ Roadmap (Gantt items) ============
  // Quarter axis: Q1 2026 → Q2 2027 (6 quarters, indexed 0..5)
  // position is 0..6 (0 = start of Q1 2026, 6 = end of Q2 2027)
  const SEED_ROADMAP = [
    // { id, program, label, start, end, status, milestoneAt }
    { id:'dcx-w1', program:'dcx',     label:'Wave 1 · rehost/retire',    start:0.4, end:1.3,  status:'done' },
    { id:'dcx-w2', program:'dcx',     label:'Wave 2 · replatform',       start:1.4, end:2.8,  status:'in-flight' },
    { id:'dcx-w3', program:'dcx',     label:'Wave 3 · refactor',         start:2.6, end:4.3,  status:'at-risk' },
    { id:'dcx-w4', program:'dcx',     label:'Wave 4 · cutover',          start:4.3, end:5.5,  status:'planned' },
    { id:'dcx-w5', program:'dcx',     label:'Wave 5 · DC close',         start:5.4, end:6.0,  status:'planned' },

    { id:'lz-ct',  program:'landing', label:'Control Tower baseline',    start:0.0, end:1.0,  status:'done' },
    { id:'lz-fp',  program:'landing', label:'fraud-prod + DR',           start:1.1, end:2.0,  status:'in-flight' },

    { id:'fin-1',  program:'finops',  label:'Rightsizing + SP 1y',       start:0.3, end:1.8,  status:'in-flight' },
    { id:'fin-2',  program:'finops',  label:'Budget gates in CI',        start:1.9, end:3.0,  status:'planned' },
    { id:'fin-3',  program:'finops',  label:'Unit-economics v2',         start:3.0, end:4.5,  status:'planned' },

    { id:'k8s-1',  program:'k8s',     label:'EKS migration · first 6',   start:0.0, end:1.6,  status:'done' },
    { id:'k8s-2',  program:'k8s',     label:'Mesh + mTLS strict',        start:1.5, end:2.7,  status:'in-flight' },
    { id:'k8s-3',  program:'k8s',     label:'Remaining 6 workloads',     start:2.6, end:4.8,  status:'planned' },

    { id:'cicd-1', program:'cicd',    label:'SLSA-3 · signing rollout',  start:0.8, end:2.4,  status:'in-flight' },
    { id:'cicd-2', program:'cicd',    label:'Canary + Argo Rollouts',    start:2.3, end:3.7,  status:'planned' },

    { id:'sec-1',  program:'sec',     label:'Close criticals · posture', start:0.1, end:1.2,  status:'at-risk' },
    { id:'sec-2',  program:'sec',     label:'SOC2 Type II evidence',     start:1.2, end:3.5,  status:'planned' },

    { id:'obs-1',  program:'obs',     label:'SLO v1 · 20 services',      start:0.0, end:2.1,  status:'in-flight' },
    { id:'obs-2',  program:'obs',     label:'SLO v2 · error budgets',    start:2.1, end:4.0,  status:'planned' },

    { id:'dx-1',   program:'dx',      label:'Backstage + golden paths',  start:0.0, end:2.4,  status:'in-flight' },
    { id:'dx-2',   program:'dx',      label:'Scorecards + IDP v2',       start:2.4, end:4.2,  status:'planned' },
  ];

  const QUARTERS = [
    { label:'Q1 26' },
    { label:'Q2 26' },
    { label:'Q3 26' },
    { label:'Q4 26' },
    { label:'Q1 27' },
    { label:'Q2 27' },
  ];

  // ============ Cost trajectory ============
  // Quarterly $M run-rate: on-prem DC + cloud spend + savings booked
  // Today is Q2 2026 (index 1) per realistic demo timing
  const SEED_COST_SERIES = [
    { q:'Q1 26', dc: 12.5, cloud: 2.1, saved: 0.0 },
    { q:'Q2 26', dc: 11.8, cloud: 3.2, saved: 0.4 },
    { q:'Q3 26', dc:  9.4, cloud: 4.1, saved: 1.2 },
    { q:'Q4 26', dc:  7.1, cloud: 5.0, saved: 2.3 },
    { q:'Q1 27', dc:  4.8, cloud: 6.2, saved: 3.8 },
    { q:'Q2 27', dc:  1.6, cloud: 7.4, saved: 5.2 },
  ];

  const TODAY_INDEX = 1.25; // ~25% into Q2 2026

  // ============ State ============
  let state = {
    programs: [...SEED_PROGRAMS],
    roadmap:  [...SEED_ROADMAP],
    costSeries: [...SEED_COST_SERIES],
    quarters: QUARTERS,
    today: TODAY_INDEX,
  };

  function emit() { for (const l of listeners) l(); }

  function useStore() {
    return React.useSyncExternalStore(
      (cb) => { listeners.add(cb); return () => listeners.delete(cb); },
      () => state
    );
  }

  // ============ Derived rollups ============
  function rollups(s) {
    const totalBooked  = s.programs.reduce((a, p) => a + p.bookedM,   0);
    const totalForecast= s.programs.reduce((a, p) => a + p.forecastM, 0);
    const avgPct       = Math.round(s.programs.reduce((a, p) => a + p.pctComplete, 0) / s.programs.length);
    const ragCount     = { green: 0, amber: 0, red: 0 };
    s.programs.forEach(p => ragCount[p.rag]++);

    const endDC    = s.costSeries[s.costSeries.length - 1].dc;
    const startDC  = s.costSeries[0].dc;
    const dcExit   = ((startDC - endDC) / startDC * 100);
    const totalSaved = s.costSeries[s.costSeries.length - 1].saved;
    const endRunRate = s.costSeries[s.costSeries.length - 1].cloud + endDC;
    const startRunRate = s.costSeries[0].cloud + startDC;

    return { totalBooked, totalForecast, avgPct, ragCount, dcExit, totalSaved, endRunRate, startRunRate };
  }

  window.ProgramStore = {
    get state() { return state; },
    useStore,
    rollups,
  };
})();
