// Brand-accurate offer document — auto-paginating så korta avsnitt får dela sida
function OfferPreview({ offer }) {
  const sub = offer.lines.reduce((s,l) => s + l.qty*l.price, 0);
  const disc = sub * (offer.discount || 0) / 100;
  const net = sub - disc;
  const vat = net * 0.25;
  const total = net + vat;
  const term = offer.term || 48;
  const monthly = net/term;
  const mode = offer.pricingMode || 'kontant';

  const renderBody = (text) => {
    if (!text) return null;
    const blocks = text.split(/\n\n+/);
    return blocks.map((blk, i) => {
      const lines = blk.split('\n');
      const isList = lines.every(l => /^\s*[•\-*]/.test(l));
      if (isList) return (
        <ul key={i} style={{margin:'0 0 14px', paddingLeft:20, fontFamily:'var(--font-sans)', fontSize:14, color:'var(--ulab-navy)', lineHeight:1.7}}>
          {lines.map((l,j) => <li key={j} style={{marginBottom:4}}>{l.replace(/^\s*[•\-*]\s*/, '')}</li>)}
        </ul>
      );
      return <p key={i} style={{margin:'0 0 14px', fontFamily:'var(--font-sans)', fontSize:14, color:'var(--ulab-navy)', lineHeight:1.7, maxWidth:'66ch'}}>{blk}</p>;
    });
  };

  const groups = offer.lines.reduce((g, l) => { (g[l.cat||'Övrigt'] ||= []).push(l); return g; }, {});
  // Sortera om så Tjänster → Kostnad → Finansiering alltid följer direkt efter Produkter
  const ORDER = ['summary','need','solution','products','services','cost','finance','support','about','terms','close'];
  const orderKey = (s) => {
    if (s.isProductList) return ORDER.indexOf('products');
    if (s.isServiceList) return ORDER.indexOf('services');
    if (s.kind === 'cost') return ORDER.indexOf('cost');
    const idx = ORDER.indexOf(s.kind);
    return idx >= 0 ? idx : 999; // okända/egna avsnitt behåller sin plats sist
  };
  const rawSections = [...(offer.sections || [])].map((s, i) => ({s, i}))
    .sort((a, b) => {
      const ka = orderKey(a.s), kb = orderKey(b.s);
      if (ka !== kb) return ka - kb;
      return a.i - b.i;
    })
    .map(x => x.s);
  // Säkerställ att Kostnadssammanställning (Steg 3) alltid kommer med — annars hamnar pris/totaler aldrig i offerten
  const hasCost = rawSections.some(s => s.kind === 'cost');
  const sections = hasCost ? rawSections : (() => {
    const arr = [...rawSections];
    // Lägg in Kostnadssammanställning EFTER tjänster (om finns), annars efter produkter
    const servicesIdx = arr.findIndex(s => s.isServiceList);
    const productsIdx = arr.findIndex(s => s.isProductList);
    const anchorIdx = servicesIdx >= 0 ? servicesIdx : productsIdx;
    const insertIdx = anchorIdx >= 0 ? anchorIdx + 1 : arr.length;
    arr.splice(insertIdx, 0, {
      id:'auto-cost', kind:'cost', title:'Kostnadssammanställning', body:'', isProductList:false, isServiceList:false, _auto:true,
    });
    return arr;
  })();
  const services = offer.services || [];
  const monthlyServiceTotal = services.reduce((s,l) => s + (l.qty||0)*(l.price||0), 0);

  // Auto‑paginate: gruppera korta avsnitt på samma sida (estimera höjd)
  const PAGE_HEIGHT = 920; // px tillgängligt
  const estimateHeight = (s) => {
    if (s.isProductList) {
      // Produkter med kategori‑rubriker + radtotaler + sammanfattningsbox
      const catCount = Object.keys(groups).length || 1;
      const lineCount = Object.values(groups).flat().length;
      return 110 + catCount*30 + lineCount*44 + 180;
    }
    if (s.isServiceList) return 110 + services.length * 44 + 120;
    if (s.kind === 'cost') return 380 + (services.length>0 ? 80 + services.length*24 : 0);
    const txt = s.body || '';
    const lines = Math.ceil(txt.length / 70) + (txt.match(/\n/g)||[]).length;
    return 110 + lines * 24; // titel + textrader (med marginal under)
  };
  const pages = [];
  let cur = [];
  let curH = 0;
  for (const s of sections) {
    const h = estimateHeight(s);
    // Tunga avsnitt (produkter, tjänster, kostnad) får alltid egen sida när möjligt
    const isHeavy = s.isProductList || s.isServiceList || s.kind === 'cost';
    const prevIsHeavy = cur.length > 0 && (
      cur[cur.length-1].isProductList ||
      cur[cur.length-1].isServiceList ||
      cur[cur.length-1].kind === 'cost'
    );
    const wouldOverflow = curH + h > PAGE_HEIGHT && cur.length > 0;
    // Bryt sida före ett tungt avsnitt om föregående var TEXT (men låt produkter→tjänster→kostnad blir tight block)
    const heavyAfterText = isHeavy && cur.length > 0 && !prevIsHeavy && curH > 280;
    if (wouldOverflow || heavyAfterText) {
      pages.push(cur); cur = []; curH = 0;
    }
    cur.push(s); curH += h;
  }
  if (cur.length) pages.push(cur);

  // Post-process: undvik att enstaka korta textavsnitt (typ Avslutning) blir ensamma på sista sidan
  if (pages.length >= 2) {
    const last = pages[pages.length - 1];
    const prev = pages[pages.length - 2];
    const isLight = (s) => !s.isProductList && !s.isServiceList && s.kind !== 'cost';
    const lastH = last.reduce((h,s)=>h+estimateHeight(s),0);
    const prevH = prev.reduce((h,s)=>h+estimateHeight(s),0);
    if (last.length <= 2 && last.every(isLight) && lastH < 360 && prevH + lastH < PAGE_HEIGHT) {
      prev.push(...last);
      pages.pop();
    }
  }

  const totalPages = 1 + pages.length;
  let pn = 0;
  const next = () => ++pn;

  return (
    <div className="offer-print-root" style={{padding:32, background:'var(--ulab-cool-grey)', display:'flex', flexDirection:'column', gap:24, alignItems:'center'}}>
      <style>{`
        .offer-print-root, .offer-print-root * {
          -webkit-print-color-adjust: exact !important;
          print-color-adjust: exact !important;
          color-adjust: exact !important;
        }
        @media print {
          @page { size: A4; margin: 0; }
          html, body { background:#fff !important; -webkit-print-color-adjust: exact !important; print-color-adjust: exact !important; }
          body * { visibility: hidden !important; }
          .offer-print-root, .offer-print-root * { visibility: visible !important; }
          .offer-print-root { position:absolute; left:0; top:0; padding:0 !important; gap:0 !important; background:#fff !important; }
          .offer-page {
            box-shadow: none !important;
            page-break-after: always; break-after: page;
            margin:0 !important;
            -webkit-print-color-adjust: exact !important;
            print-color-adjust: exact !important;
          }
          .offer-page:last-child { page-break-after: auto; }
        }
      `}</style>
      <Page n={next()} total={totalPages} hideHeader noPad>
        <div style={{display:'flex', flexDirection:'column', height:'100%', position:'relative'}}>
          {/* Coral accent band */}
          <div style={{height:8, background:'var(--ulab-coral)'}}/>

          {/* Top: logo + meta */}
          <div style={{padding:'40px 64px 0', display:'flex', justifyContent:'space-between', alignItems:'flex-start'}}>
            <img src="ulab-logo.png" style={{height:46}} alt="ULAB"/>
            <div style={{textAlign:'right', fontSize:11, color:'var(--fg-muted)', lineHeight:1.7, letterSpacing:'.04em'}}>
              <div style={{fontSize:10, fontWeight:600, letterSpacing:'.18em', textTransform:'uppercase', color:'var(--ulab-blue)'}}>Offert</div>
              <div style={{color:'var(--ulab-navy)', fontWeight:700, fontSize:13, marginTop:2}}>#{offer.number}</div>
              <div style={{marginTop:2}}>{offer.date}</div>
            </div>
          </div>

          {/* Hero block */}
          <div style={{padding:'56px 64px 40px', flex:'0 0 auto'}}>
            <div style={{fontSize:11, fontWeight:600, letterSpacing:'.22em', textTransform:'uppercase', color:'var(--ulab-coral)', marginBottom:18}}>
              Make IT easy
            </div>
            <h1 style={{fontFamily:'var(--font-serif)', fontWeight:500, fontSize:64, color:'var(--ulab-navy)', lineHeight:1.0, margin:'0 0 18px', letterSpacing:'-0.012em', maxWidth:'14ch'}}>
              {offer.subject || 'Vi är din trygga\nhelhetsleverantör.'}
            </h1>
            <div style={{height:3, width:64, background:'var(--ulab-coral)', margin:'24px 0 28px'}}/>
            <div style={{fontFamily:'var(--font-serif)', fontSize:24, color:'var(--ulab-navy)', lineHeight:1.45, fontWeight:400}}>
              Ett förslag framtaget för<br/>
              <b style={{fontWeight:600}}>{offer.customer || '—'}</b>
              {offer.contact && <span style={{fontFamily:'var(--font-sans)', fontSize:14, color:'var(--fg-muted)', display:'block', marginTop:8, fontWeight:400}}>Att: {offer.contact}</span>}
            </div>
          </div>

          {/* Three value pillars */}
          <div style={{padding:'28px 64px 36px', background:'var(--ulab-cream)', borderTop:'1px solid #ede4d4', borderBottom:'1px solid #ede4d4'}}>
            <div style={{display:'grid', gridTemplateColumns:'1fr 1fr 1fr', gap:32}}>
              {[
                ['Personlig kontakt', 'Våra medarbetare kombinerar flera kompetenser och tar gärna ansvarar för att ditt kontor fungerar som det ska. Vi kan tekniken som vi säljer och levererar. Just därför gör vi vad vi kan för att hitta lösningar som fungerar bäst för din arbetsplats.'],
                ['Hela IT‑ansvaret', 'Nätverk, server, säkerhet, telefoni och arbetsplats — på ett avtal.'],
                ['Trygghet i drift', 'Övervakning, backup och säkerhet som är aktiv dygnet runt.'],
              ].map(([t, b]) => (
                <div key={t}>
                  <div style={{fontSize:11, fontWeight:600, letterSpacing:'.16em', textTransform:'uppercase', color:'var(--ulab-blue)', marginBottom:8}}>{t}</div>
                  <div style={{fontSize:13, color:'var(--ulab-navy)', lineHeight:1.55, fontFamily:'var(--font-sans)'}}>{b}</div>
                </div>
              ))}
            </div>
          </div>

          {/* Spacer pushes footer down */}
          <div style={{flex:1}}/>

          {/* Footer block: salesperson + dates */}
          <div style={{padding:'28px 64px 40px', display:'grid', gridTemplateColumns:'1fr 1fr', gap:40, borderTop:'1px solid #ede4d4'}}>
            <div>
              <div style={{fontSize:10, fontWeight:600, letterSpacing:'.18em', textTransform:'uppercase', color:'var(--fg-muted)', marginBottom:8}}>Din kontaktperson på Ulab IT Partner</div>
              <div style={{color:'var(--ulab-navy)', fontWeight:700, fontSize:16, fontFamily:'var(--font-serif)'}}>{offer.salesperson || 'Adam Bjarneteg'}</div>
              <div style={{fontSize:13, color:'var(--ulab-navy)', marginTop:4}}>{offer.salesphone || '0767 – 72 15 21'}</div>
              <div style={{fontSize:13, color:'var(--ulab-navy)'}}>{offer.salesemail || 'adam.bjarneteg@ulabitpartner.se'}</div>
            </div>
            <div style={{textAlign:'right'}}>
              <div style={{fontSize:10, fontWeight:600, letterSpacing:'.18em', textTransform:'uppercase', color:'var(--fg-muted)', marginBottom:8}}>Offertens giltighet</div>
              <div style={{color:'var(--ulab-navy)', fontWeight:700, fontSize:16, fontFamily:'var(--font-serif)'}}>{offer.valid || '—'}</div>
              <div style={{fontSize:13, color:'var(--fg-muted)', marginTop:4}}>Skapad {offer.date}</div>
              <div style={{fontSize:12, color:'var(--fg-muted)', marginTop:8}}>ULAB IT Partner AB · Borås & Örby</div>
            </div>
          </div>

          {/* Bottom coral band */}
          <div style={{height:8, background:'var(--ulab-coral)'}}/>
        </div>
      </Page>

      {pages.map((sectionsOnPage, pi) => (
        <Page key={pi} n={next()} total={totalPages} customer={offer.customer} subject={offer.subject}
          center={sectionsOnPage.every(s => !s.isProductList && !s.isServiceList && s.kind !== 'cost') && sectionsOnPage.reduce((h,s)=>h+estimateHeight(s),0) < 760}>
          {sectionsOnPage.map((s, si) => (
            <div key={s.id} style={{marginBottom: si < sectionsOnPage.length-1 ? 56 : 0, paddingBottom: si < sectionsOnPage.length-1 ? 8 : 0, borderBottom: si < sectionsOnPage.length-1 ? '1px solid #ece5d8' : 'none'}}>
              <h2 style={{fontFamily:'var(--font-serif)', fontWeight:500, fontSize:30, color:'var(--ulab-navy)', margin:'0 0 4px', lineHeight:1.15}}>{s.title}</h2>
              <div style={{height:2, width:36, background:'var(--ulab-coral)', margin:'0 0 22px'}}/>
              {s.isProductList ? (
                <>
                  {Object.entries(groups).map(([cat, lines]) => (
                    <div key={cat} style={{marginBottom:18}}>
                      <div style={{fontSize:11, fontWeight:600, letterSpacing:'.18em', textTransform:'uppercase', color:'var(--ulab-blue)', borderBottom:'1px solid var(--ulab-navy)', paddingBottom:6, marginBottom:6}}>{cat}</div>
                      {lines.map(l => (
                        <div key={l.id} style={{padding:'8px 0', borderBottom:'1px solid #ece5d8'}}>
                          <div style={{display:'grid', gridTemplateColumns:'1fr 60px 80px 90px 110px', gap:8, fontSize:13, color:'var(--ulab-navy)'}}>
                            <span style={{fontWeight:600}}>{l.name || '—'}</span>
                            <span style={{textAlign:'right', fontVariantNumeric:'tabular-nums'}}>{l.qty}</span>
                            <span style={{color:'var(--fg-muted)'}}>{l.unit}</span>
                            <span style={{textAlign:'right', fontVariantNumeric:'tabular-nums'}}>{fmtKr(l.price)}</span>
                            <span style={{textAlign:'right', fontVariantNumeric:'tabular-nums', fontWeight:600}}>{fmtKr(l.qty*l.price)}</span>
                          </div>
                          {l.desc && <div style={{fontSize:12, color:'var(--fg-muted)', marginTop:4, lineHeight:1.5, maxWidth:'70%'}}>{l.desc}</div>}
                        </div>
                      ))}
                    </div>
                  ))}
                  <div style={{marginTop:14, marginLeft:'auto', maxWidth:360, fontVariantNumeric:'tabular-nums', padding:'10px 14px', background:'var(--ulab-cream)', borderRadius:4}}>
                    <PRow label="Produkter & tjänster" v={fmtKr(sub)}/>
                    {disc>0 && <PRow label={`Rabatt ${offer.discount}%`} v={'– '+fmtKr(disc)}/>}
                    <div style={{height:1, background:'var(--border-strong)', margin:'6px 0'}}/>
                    <PRow big label="Summa exkl. moms" v={fmtKr(net)}/>
                    <div style={{fontSize:11, color:'var(--fg-muted)', marginTop:6}}>Komplett kostnadssammanställning återfinns under "Kostnadssammanställning".</div>
                  </div>
                </>
              ) : s.kind === 'cost' ? (
                <CostSummary
                  offer={offer} sub={sub} disc={disc} net={net} vat={vat} total={total}
                  monthly={monthly} mode={mode} term={term}
                  services={services} monthlyServiceTotal={monthlyServiceTotal}
                  body={s.body}
                />
              ) : s.isServiceList ? (
                <>
                  {(offer.services||[]).length===0 && <div style={{fontSize:13, color:'var(--fg-muted)'}}>Inga tjänster angivna.</div>}
                  {(offer.services||[]).map(l => (
                    <div key={l.id} style={{padding:'10px 0', borderBottom:'1px solid #ece5d8'}}>
                      <div style={{display:'grid', gridTemplateColumns:'1fr 60px 90px 110px 120px', gap:8, fontSize:13, color:'var(--ulab-navy)'}}>
                        <span style={{fontWeight:600}}>{l.name||'—'}</span>
                        <span style={{textAlign:'right', fontVariantNumeric:'tabular-nums'}}>{l.qty}</span>
                        <span style={{color:'var(--fg-muted)'}}>{l.unit}</span>
                        <span style={{textAlign:'right', fontVariantNumeric:'tabular-nums'}}>{fmtKr(l.price)}</span>
                        <span style={{textAlign:'right', fontVariantNumeric:'tabular-nums', fontWeight:600}}>{fmtKr(l.qty*l.price)}/{l.unit}</span>
                      </div>
                      {l.desc && <div style={{fontSize:12, color:'var(--fg-muted)', marginTop:4, lineHeight:1.5, maxWidth:'70%'}}>{l.desc}</div>}
                    </div>
                  ))}
                  {(offer.services||[]).length>0 && (
                    <div style={{marginTop:14, padding:'10px 14px', background:'var(--ulab-cream)', borderRadius:4, marginLeft:'auto', maxWidth:360, fontVariantNumeric:'tabular-nums'}}>
                      <PRow big label="Total / period" v={fmtKr((offer.services||[]).reduce((s,l)=>s+l.qty*l.price,0))}/>
                    </div>
                  )}
                </>
              ) : renderBody(s.body)}
            </div>
          ))}
        </Page>
      ))}
    </div>
  );
}

function Page({children, n, total, customer, subject, hideHeader, noPad, center}) {
  return (
    <div className="offer-page" style={{
      width: 794, height: 1123, background:'var(--ulab-cream)',
      boxShadow:'0 2px 4px rgba(0,54,95,.06),0 14px 36px rgba(0,54,95,.10)',
      padding: noPad ? 0 : '48px 64px 56px', position:'relative',
      display:'flex', flexDirection:'column', boxSizing:'border-box', overflow:'hidden',
    }}>
      {!hideHeader && (
        <div style={{display:'flex', justifyContent:'space-between', alignItems:'center', paddingBottom:14, marginBottom:24, borderBottom:'1px solid #ece5d8', fontSize:11, color:'var(--fg-muted)'}}>
          <span><b style={{color:'var(--ulab-navy)'}}>{customer || '—'}</b>{subject ? ` · ${subject}` : ''}</span>
          <span>Sida {n} av {total}</span>
        </div>
      )}
      <div style={{flex:1, display:'flex', flexDirection:'column', justifyContent: center?'center':'flex-start'}}>{children}</div>
      {!hideHeader && (
        <div style={{position:'absolute', bottom:24, left:64, right:64, paddingTop:14, borderTop:'1px solid #ece5d8', display:'flex', justifyContent:'space-between', fontSize:10, color:'var(--fg-muted)'}}>
          <span>ulabitpartner.se · 020 – 10 45 80</span>
          <span>ULAB Borås · ULAB Örby</span>
        </div>
      )}
    </div>
  );
}
function CostSummary({ offer, sub, disc, net, vat, total, monthly, mode, term, services, monthlyServiceTotal, body }) {
  // Speglar TotalsPanel i editorn (steg 3) exakt — samma fält, samma ordning.
  return (
    <div>
      {body && <div style={{marginBottom:18, fontFamily:'var(--font-sans)', fontSize:14, color:'var(--ulab-navy)', lineHeight:1.7, maxWidth:'66ch'}}>{body}</div>}
      <div style={{display:'flex', justifyContent:'flex-end'}}>
        <div style={{
          width:380, padding:'22px 26px', background:'var(--ulab-cream)', borderRadius:6,
          fontVariantNumeric:'tabular-nums', fontFamily:'var(--font-sans)',
        }}>
          <PRow label="Summa" v={fmtKr(sub)}/>
          {disc>0 && <PRow label={`Rabatt ${offer.discount}%`} v={'– '+fmtKr(disc)}/>}
          <PRow label="Netto" v={fmtKr(net)}/>
          <PRow label="Moms 25%" v={fmtKr(vat)}/>
          <div style={{height:1, background:'var(--border-strong)', margin:'10px 0'}}/>
          <PRow big label="Att betala" v={fmtKr(total)}/>
          {mode==='hyra' && term>0 && (
            <div style={{marginTop:10, fontSize:13, color:'var(--ulab-navy)'}}>≈ <b>{fmtKr(net/term)}</b> / mån i {term} mån</div>
          )}
          {mode==='bada' && term>0 && (
            <div style={{marginTop:10, fontSize:13, color:'var(--ulab-navy)'}}>Kontant: <b>{fmtKr(total)}</b><br/>eller hyra: <b>{fmtKr(net/term)}</b>/mån i {term} mån</div>
          )}
          {services.length>0 && (
            <div style={{marginTop:14, paddingTop:12, borderTop:'1px dashed var(--border-strong)'}}>
              <div style={{fontSize:10, fontWeight:600, letterSpacing:'.18em', textTransform:'uppercase', color:'var(--ulab-coral)', marginBottom:6}}>Månadskostnader</div>
              {services.map(l => (
                <div key={l.id} style={{display:'flex', justifyContent:'space-between', fontSize:13, color:'var(--ulab-navy)', padding:'2px 0'}}>
                  <span>{l.name || '—'}{l.qty>1 && <span style={{color:'var(--fg-muted)'}}> × {l.qty}</span>}</span>
                  <span>{fmtKr((l.qty||0)*(l.price||0))}/{l.unit||'mån'}</span>
                </div>
              ))}
              <div style={{height:1, background:'var(--border-strong)', margin:'6px 0'}}/>
              <PRow big label="Per månad" v={fmtKr(monthlyServiceTotal)}/>
            </div>
          )}
        </div>
      </div>
      <div style={{marginTop:14, fontSize:11, color:'var(--fg-muted)', lineHeight:1.6}}>
        Alla priser anges exklusive moms där inget annat anges. Frakt och eventuell resa enligt avtal.
      </div>
    </div>
  );
}
function PRow({label, v, big}) {
  return (
    <div style={{display:'flex', justifyContent:'space-between', padding:'4px 0', fontSize: big?16:13, fontWeight: big?700:500, color:'var(--ulab-navy)'}}>
      <span>{label}</span><span>{v}</span>
    </div>
  );
}
window.OfferPreview = OfferPreview;
