import {calculateIT,calculateWeb,euro,bounded} from './pricing-engine.mjs'; const escape=s=>String(s).replace(/[&<>"']/g,c=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c])); const cfg=window.pds4Config;const p=cfg?.pricing; const kinds={website:'Unternehmenswebsite',bundle:'Website + Reservierung',reservation:'Nur Reservierungssystem',shop:'Online-Shop',redesign:'Website überarbeiten'}; const option=(v,label,current)=>``; const field=(label,key,value,min,max,step=1)=>``; const warn='Lizenzen, Hardware, Fahrt- und Fremdkosten werden nach Bedarf separat vereinbart und sind derzeit nicht beziffert.'; function actions(summary,kind,selection){return `
${kind}-Angebot über WhatsApp anfordernAngebot anfordern

WhatsApp wird erst nach Ihrem Klick geöffnet. Sie senden die Nachricht dort selbst.
`;} const typeAnchor=type=>type==='web'?'web-kalkulator':type==='it'?'it-kalkulator':'konfigurator'; function boot(){ for(const root of document.querySelectorAll('.pds4-calculator')){ if(root.dataset.pds5Ready||!p)continue;root.dataset.pds5Ready='1';const anchor=typeAnchor(root.dataset.type);if(!root.id&&!document.getElementById(anchor))root.id=anchor; const type=root.dataset.type;const state={tab:type==='web'?'web':'it',it:{mode:'once',package:'basic',devices:3,rows:[],hours:0,channel:'remote'},web:{kind:'website',pages:0,term:'none'}};let summary=''; function render(){const tabs=type==='both'?`
`:''; if(state.tab==='web'){ const s=state.web,r=calculateWeb(p,s);summary=['WEBDESIGN – Unverbindliche Preisorientierung',kinds[r.kind],`Grundpreis: ${r.base===null?'auf Anfrage':euro(r.base)}`,`Zusätzliche Seiten: ${r.pages} × ${euro(p.extraPage)} = ${euro(r.extras)}`,`Einmalig: ${r.once===null?'auf Anfrage':euro(r.once)}`,`Monatlich: ${euro(r.monthly)}`,`Laufzeit: ${r.duration?r.duration+' Monate':'keine Verwaltung'}`,r.duration?`Verwaltung über Laufzeit: ${euro(r.monthly*r.duration)}`:'',r.termTotal!==null&&r.duration?`Gesamtrichtwert: ${euro(r.termTotal)}`:'','Hosting, Domain, Premium-Lizenzen und Erweiterungen nach Bedarf separat.',p.taxNote].filter(Boolean).join('\n'); root.innerHTML=tabs+`

Ihr Website-Projekt

${s.kind==='bundle'?'

Bundle-Preis separat zu bestätigen. Kein unbestätigter Gesamtpreis.

':''}${['website','bundle'].includes(s.kind)?field('Zusätzliche Seiten (acht enthalten)','pages',s.pages,0,100):''}

Neue Seiten, neue Funktionen und größere Erweiterungen separat nach Vereinbarung.

`; }else{ const s=state.it,r=calculateIT(p,s);summary=['IT-SERVICE – Unverbindliche Preisorientierung',s.mode==='monthly'?`${p.packages[r.package].label}: ${r.requested} Geräte, berechnet ${r.billed}`:'Einmaliger Service',...r.items.map(row=>`${row.label}: ${row.qty} × ${row.price===null?'auf Anfrage':euro(row.price)} = ${row.total===null?'auf Anfrage':euro(row.total)}`),`Einmalig: ${r.once===null?'auf Anfrage; bekannte Positionen ab '+euro(r.knownSubtotal):'ab '+euro(r.once)}`,`Monatlich: ${euro(r.monthly)}`,s.mode==='monthly'?`Jährlicher Richtwert: ${euro(r.yearly)}\nErstes Jahr inkl. Onboarding ab: ${euro(r.firstYear)}\nEnthaltene Fernwartung: ${r.minutes} Minuten monatlich\nMindestens drei Geräte. Keine Übertragung von Minuten, kein unbegrenzter Support, keine 24/7-Zusage. Umfang und Reaktionszeiten nach Vereinbarung.`:'Supportstunden nur für separat vereinbarte zusätzliche Arbeiten, keine doppelte Verrechnung.',warn,p.taxNote].join('\n'); const once=`
${s.rows.map(row=>{const v=p.services.find(v=>v.id===row.id);return `
${escape(v.label)}${v.price===null?'Auf Anfrage':'ab '+euro(v.price)} je ${escape({device:'Gerät',user:'Benutzer',case:'Standardfall',company:'Unternehmen'}[v.unit])}
`}).join('')}

Zusätzlicher Support

${field('Geschätzte Stunden für zusätzliche Arbeiten','hours',s.hours,0,100,0.25)}

Keine doppelte Verrechnung. Stunden nur für weitere Arbeiten außerhalb ausgewählter Leistungen. Viertelstunden sind Eingabeschritte, keine vertragliche Abrechnungstaktung.

`; const monthly=`${field('Anzahl Ihrer Geräte','devices',s.devices,1,999)}${s.devicesDie Mindestpauschale entspricht ${p.minDevices} Geräten.

`:''}

${p.packages[s.package].minutes} Minuten Fernwartung je Gerät. ${s.package==='basic'?'E-Mail-Support und Gerätecheck.':s.package==='business'?'Zusätzlich Microsoft-365-Basisverwaltung und Basis-Sicherheitsprüfung.':'Zusätzlich Microsoft-365-Basisverwaltung, Basis-Sicherheitsprüfung, Intune für geeignete Geräte und priorisierte Bearbeitung im vereinbarten Servicefenster.'} Umfang und Reaktionszeiten vor Vertragsabschluss festlegen. Kein unbegrenzter Support, keine Übertragung ungenutzter Minuten, keine Lizenzen inklusive.

`; root.innerHTML=tabs+`
${s.mode==='once'?once:monthly}
`; } availability(); } root.addEventListener('click',async e=>{const a=e.target.closest('a');if(a?.getAttribute('aria-disabled')==='true'){e.preventDefault();return;}if(a?.dataset.pds5Offer){try{sessionStorage.setItem('pds5-offer',a.dataset.pds5Offer);}catch{}}const b=e.target.closest('button');if(!b)return;const s=state.it;if(b.dataset.tab){state.tab=b.dataset.tab;history.replaceState(null,'','#'+(state.tab==='it'?'it-kalkulator':'web-kalkulator'));render();}else if(b.dataset.mode){s.mode=b.dataset.mode;render();}else if(b.hasAttribute('data-add')){const id=root.querySelector('[data-picker]').value;if(!s.rows.some(v=>v.id===id)){s.rows.push({id,qty:1});render();}else root.querySelector('.copy-status').textContent='Diese Leistung ist bereits enthalten.';}else if(b.dataset.remove){s.rows=s.rows.filter(v=>v.id!==b.dataset.remove);render();}else if(b.hasAttribute('data-copy')){try{await navigator.clipboard.writeText(summary);root.querySelector('.copy-status').textContent='Kalkulation kopiert.';}catch{const ta=root.querySelector('.copy-fallback');ta.hidden=false;ta.focus();ta.select();root.querySelector('.copy-status').textContent='Bitte mit Strg+C oder ⌘C kopieren.';}}}); root.addEventListener('change',e=>{const el=e.target;if(el.type==='number'&&!el.validity.valid){availability();return;}const s=state.tab==='web'?state.web:state.it;if(el.dataset.row){s.rows=s.rows.map(v=>v.id===el.dataset.row?{...v,qty:bounded(el.value,1,999)}:v);render();}else if(el.dataset.key){const key=el.dataset.key;s[key]=el.type==='number'?bounded(el.value,Number(el.min),Number(el.max),Number(el.step)):el.value;render();}}); function availability(){ const invalid=[...root.querySelectorAll('input[type=number]')].some(el=>!el.validity.valid); const empty=state.tab==='it'&&state.it.mode==='once'&&state.it.rows.length===0&&state.it.hours===0; const disabled=invalid||empty; root.querySelectorAll('.calc-actions a').forEach(a=>{if(!a.dataset.pds5Href)a.dataset.pds5Href=a.getAttribute('href')||'';a.setAttribute('aria-disabled',String(disabled));if(disabled)a.removeAttribute('href');else a.href=a.dataset.pds5Href;}); root.querySelectorAll('[data-copy]').forEach(b=>b.disabled=disabled); let note=root.querySelector('.pds5-validation');if(!note){note=document.createElement('p');note.className='pds5-validation';note.setAttribute('role','status');root.querySelector('.config-summary').append(note);} note.textContent=invalid?'Bitte eine gültige Menge innerhalb der angezeigten Grenzen eingeben.':empty?'Wählen Sie eine IT-Leistung oder zusätzliche Supportstunden aus.':''; } root.addEventListener('input',e=>{if(e.target.type==='number'){e.target.setAttribute('aria-invalid',String(!e.target.validity.valid));availability();}}); function hash(){if(type==='both'&&['#web-kalkulator','#website-kalkulator','#webdesign-kalkulator'].includes(location.hash))state.tab='web';else if(type==='both'&&location.hash==='#it-kalkulator')state.tab='it';render();availability();if(['#it-kalkulator','#web-kalkulator','#website-kalkulator','#webdesign-kalkulator','#konfigurator'].includes(location.hash)&&typeof root.scrollIntoView==='function')root.scrollIntoView({block:'start'});}window.addEventListener('hashchange',hash);hash();availability(); } for(const form of document.querySelectorAll('.pds4-contact-form')){ if(form.dataset.pds5Ready)continue;form.dataset.pds5Ready='1'; try{const selected=sessionStorage.getItem('pds5-offer');if(selected){JSON.parse(selected);form.querySelector('[name=selection]').value=selected;const box=form.querySelector('.pds5-selection');box.hidden=false;box.textContent='Ihre Auswahl aus dem Kalkulator wird mit den aktuellen Preisen in der Anfrage mitgesendet.';}}catch{} const summary=new URLSearchParams(location.search).get('summary');if(summary)form.querySelector('[name=message]').value=summary.slice(0,10000); form.addEventListener('submit',async e=>{e.preventDefault();if(!form.reportValidity())return;const button=form.querySelector('[type=submit]'),status=form.querySelector('[role=status]');button.disabled=true;status.textContent='Anfrage wird gesendet …';try{const data=new FormData(form);const response=await fetch(cfg.ajax,{method:'POST',body:data,credentials:'same-origin'});const result=await response.json();status.textContent=result.data?.message||'Versand fehlgeschlagen.';if(result.success){form.reset();try{sessionStorage.removeItem('pds5-offer');}catch{}form.querySelector('.pds5-selection').hidden=true;}}catch{status.textContent='Versand nicht möglich. Bitte per E-Mail oder WhatsApp kontaktieren.';}finally{button.disabled=false;}}); } } boot(); new MutationObserver(boot).observe(document.body,{childList:true,subtree:true});