// budsjett-rapport.jsx — Styrebudsjett-rapport i PDF-format
// Kobler til systemets data: budsjettversjoner, posteringer, kontomapping, rapportlinjer.
// Kolonner: Budsjett 2026 · Budsjett 2025 · Avvik · Årsprognose · Avvik mot prognose.
// Eksporterer BudStyrerapport (brukes i Budsjett-modulens Rapport-fane).

// Tall i hele tusen, parentes for negative
function BSR_fmt(v) {
  if (v === null || v === undefined || isNaN(v)) return '';
  const n = Math.round(v / 1000);
  if (n === 0) return '0';
  const s = new Intl.NumberFormat('nb-NO').format(Math.abs(n));
  return n < 0 ? `(${s})` : s;
}

// Summer posteringer per rapportlinje for en gitt versjon (via kontomapping)
function BSR_beløpPerLinje(data, versjonId, selskapFilter) {
  if (!versjonId) return {};
  const post = window.budBeregnPosteringer(data, versjonId);
  const mappingFor = (konto) => {
    if (selskapFilter === 'alle' || !selskapFilter)
      return data.kontomapping.find(m => m.versjon_id === versjonId && m.konto === konto && m.selskap_id == null)
          || data.kontomapping.find(m => m.versjon_id === versjonId && m.konto === konto);
    return data.kontomapping.find(m => m.versjon_id === versjonId && m.konto === konto && m.selskap_id === selskapFilter)
        || data.kontomapping.find(m => m.versjon_id === versjonId && m.konto === konto && m.selskap_id == null);
  };
  const result = {};
  post.filter(p => selskapFilter === 'alle' || !selskapFilter || p.selskap_id === selskapFilter).forEach(p => {
    const m = mappingFor(p.konto);
    if (m && m.rapportlinje_id) result[m.rapportlinje_id] = (result[m.rapportlinje_id] || 0) + p.belop;
  });
  return result;
}

function BudStyrerapport({ data, versjonId, selById }) {
  const [selskapFilter, setSelskapFilter] = React.useState('alle');
  const [visKol, setVisKol] = React.useState({ b2025: true, avvik2025: true, prognose: true, avvikP: true });
  const [redigerMode, setRedigerMode] = React.useState(false);

  // Finn sammenligningsversjoner ut fra årstall/type
  const valgtVersjon = data.versjoner.find(v => v.id === versjonId);
  const valgtAr = valgtVersjon?.ar || 2026;

  const budForrigeAr = data.versjoner.find(v => v.type === 'budsjett' && v.ar === valgtAr - 1);
  const prognose     = data.versjoner.find(v => v.type === 'prognose' && v.ar === valgtAr - 1)
                    || data.versjoner.find(v => v.type === 'prognose');

  // Beregn beløp per linje for hver kolonne
  const b2026 = BSR_beløpPerLinje(data, versjonId, selskapFilter);
  const b2025 = budForrigeAr ? BSR_beløpPerLinje(data, budForrigeAr.id, selskapFilter) : {};
  const pPrognose = prognose ? BSR_beløpPerLinje(data, prognose.id, selskapFilter) : {};

  const linjer = (data.rapportlinjer || [])
    .filter(r => r.versjon_id === versjonId)
    .sort((a, b) => (a.sortering || 0) - (b.sortering || 0));

  if (linjer.length === 0) {
    return (
      <div style={{ padding: 28, textAlign: 'center', color: SK.soft, fontSize: 13 }}>
        Ingen rapportlinjer for denne versjonen. Sett opp rapportlinjer og kontomapping først,
        så kobles tallene automatisk fra budsjettposteringene.
      </div>
    );
  }

  const verdi = (map, l) => (map[l.id] || 0) * (l.fortegn || 1);

  // Beregn verdi per linje i en gitt kolonne.
  // Detaljlinjer: fra kontomapping (* fortegn).
  // 'subtotal': summen av detaljlinjene siden forrige subtotal/sum.
  // 'sum': summen av alle detaljlinjene siden forrige 'sum' (grand total-nivå).
  const beregnKolonne = (map) => {
    const ut = {};
    let sidenSubtotal = 0;
    let sidenSum = 0;
    linjer.forEach(l => {
      if (l.type === 'subtotal') {
        ut[l.id] = sidenSubtotal;
        sidenSubtotal = 0;            // nullstill for neste gruppe
      } else if (l.type === 'sum') {
        ut[l.id] = sidenSum;
        sidenSubtotal = 0;
        sidenSum = 0;                 // grand total nullstiller alt
      } else {
        const v = verdi(map, l);
        ut[l.id] = v;
        sidenSubtotal += v;
        sidenSum += v;
      }
    });
    return ut;
  };

  // Kolonnedefinisjon
  const kolonner = [
    { nokkel: 'b2026', label: 'Budsjett', sub: String(valgtAr), alltid: true },
    { nokkel: 'b2025', label: 'Budsjett', sub: String(valgtAr - 1), vis: visKol.b2025 && !!budForrigeAr },
    { nokkel: 'avvik2025', label: 'Avvik', sub: `B${valgtAr} v B${valgtAr-1}`, avvik: true, vis: visKol.avvik2025 && !!budForrigeAr },
    { nokkel: 'prognose', label: 'Årsprognose', sub: prognose ? prognose.navn.replace(/[^0-9]/g,'') || '' : '', vis: visKol.prognose && !!prognose },
    { nokkel: 'avvikP', label: 'Avvik', sub: `B${valgtAr} v P`, avvik: true, vis: visKol.avvikP && !!prognose },
  ].filter(k => k.alltid || k.vis);

  // Forhåndsberegn alle kolonner (inkl. sum/subtotal-linjer)
  const c26 = beregnKolonne(b2026);
  const c25 = beregnKolonne(b2025);
  const cP  = beregnKolonne(pPrognose);

  const celleVerdi = (l, kol) => {
    const v26 = c26[l.id] || 0;
    const v25 = c25[l.id] || 0;
    const vp  = cP[l.id] || 0;
    switch (kol.nokkel) {
      case 'b2026': return v26;
      case 'b2025': return v25;
      case 'avvik2025': return v26 - v25;
      case 'prognose': return vp;
      case 'avvikP': return v26 - vp;
      default: return 0;
    }
  };

  return (
    <div>
      {/* Verktøylinje */}
      <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'flex-start', marginBottom: 16, gap: 12, flexWrap: 'wrap' }}>
        <div>
          <div style={{ fontSize: 16, fontWeight: 600 }}>Budsjett {valgtAr} – OsloKollega Konsern</div>
          <div style={{ fontSize: 12, color: SK.soft, marginTop: 2 }}>
            Tall i hele tusen · koblet fra budsjettposteringer
            {!budForrigeAr && ' · mangler fjorårsbudsjett'}
            {!prognose && ' · mangler prognose'}
          </div>
        </div>
        <div style={{ display: 'flex', gap: 8, alignItems: 'center' }}>
          <select className="ok-input" value={selskapFilter} onChange={e => setSelskapFilter(e.target.value)}
            style={{ maxWidth: 220, padding: '7px 10px', fontSize: 13 }}>
            <option value="alle">Hele konsernet</option>
            {data.selskaper.map(s => <option key={s.id} value={s.id}>{s.navn}</option>)}
          </select>
          <Button size="sm" variant={redigerMode ? 'primary' : 'ghost'} onClick={() => setRedigerMode(m => !m)}>
            {redigerMode ? 'Ferdig' : 'Endre oppsett'}
          </Button>
        </div>
      </div>

      {redigerMode && (
        <div style={{ background: SK.iceBlueLight, borderRadius: 10, padding: '12px 14px', marginBottom: 16 }}>
          <div style={{ fontSize: 12, fontWeight: 600, marginBottom: 8 }}>Vis kolonner</div>
          <div style={{ display: 'flex', flexWrap: 'wrap', gap: 8 }}>
            {[['b2025', `Budsjett ${valgtAr-1}`], ['avvik2025', 'Avvik mot fjorårsbudsjett'], ['prognose', 'Årsprognose'], ['avvikP', 'Avvik mot prognose']].map(([k, l]) => (
              <button key={k} onClick={() => setVisKol(p => ({ ...p, [k]: !p[k] }))} className="ok-btn ok-btn--sm" style={{
                background: visKol[k] ? SK.ink : 'transparent',
                color: visKol[k] ? '#fff' : SK.ink,
                borderColor: visKol[k] ? SK.ink : 'rgba(17,24,61,.15)',
              }}>{l}</button>
            ))}
          </div>
          <div style={{ fontSize: 11.5, color: SK.soft, marginTop: 10 }}>
            Tallene hentes automatisk fra budsjettposteringene via kontomappingen. Juster linjer i «Rapport»-fanen.
          </div>
        </div>
      )}

      <Card padded={false}>
        <div style={{ overflowX: 'auto' }}>
          <table className="ok-table" style={{ fontVariantNumeric: 'tabular-nums', minWidth: 640 }}>
            <thead>
              <tr>
                <th style={{ paddingLeft: 18, position: 'sticky', left: 0, background: '#fff', minWidth: 220 }}>Spesifikasjon resultat</th>
                {kolonner.map(k => (
                  <th key={k.nokkel} style={{ textAlign: 'right', whiteSpace: 'nowrap', fontSize: 11, fontStyle: k.avvik ? 'italic' : 'normal' }}>
                    {k.label}<br /><span style={{ fontSize: 10, color: SK.soft, fontWeight: 400 }}>{k.sub}</span>
                  </th>
                ))}
              </tr>
            </thead>
            <tbody>
              {linjer.map(l => {
                const erSum = l.type === 'sum' || l.type === 'subtotal';
                return (
                  <tr key={l.id} style={{ background: erSum ? SK.iceBlueLight + '55' : 'transparent' }}>
                    <td style={{
                      paddingLeft: 18 + (l.innrykk || 0) * 14, position: 'sticky', left: 0,
                      background: erSum ? '#eef2fa' : '#fff',
                      fontSize: 12.5, fontWeight: erSum ? 600 : 400,
                    }}>{l.navn}</td>
                    {kolonner.map(kol => {
                      const v = celleVerdi(l, kol);
                      const neg = v < 0;
                      return (
                        <td key={kol.nokkel} style={{
                          textAlign: 'right', fontSize: 12, whiteSpace: 'nowrap',
                          fontWeight: erSum ? 600 : 400, fontStyle: kol.avvik ? 'italic' : 'normal',
                          color: neg ? SK.coral : (erSum ? SK.ink : SK.soft),
                        }}>{BSR_fmt(v)}</td>
                      );
                    })}
                  </tr>
                );
              })}
            </tbody>
          </table>
        </div>
      </Card>
      <div style={{ fontSize: 11, color: SK.soft, marginTop: 10 }}>
        Negative tall i parentes og rødt. Budsjett {valgtAr} er valgt versjon; sammenligningskolonner
        finnes når fjorårsbudsjett og prognose er registrert som egne versjoner.
      </div>
    </div>
  );
}

Object.assign(window, { BudStyrerapport });
