from html import escape as esc
import json

def extend(ctx):
 R,OUT=ctx['ROOT'],ctx['OUT']
 config=json.loads((R/'site.config.json').read_text())
 schema=json.loads((R/'form_schema.json').read_text())
 (R/'integrations/google-sheets/Schema.gs').write_text('var COLUMNS='+json.dumps(schema['columns'],ensure_ascii=False)+';\nvar STATUSES='+json.dumps(schema['leadStatuses'])+';')
 render,hero,section,intro=map(ctx.get,['render','hero','section','intro'])
 pages=ctx['PAGES']
 legalpages={'kvkk':'KVKK Aydınlatma Metni','gizlilik-politikasi':'Gizlilik Politikası','cerez-politikasi':'Çerez Politikası','kullanim-sartlari':'Kullanım Şartları'}
 pages.update(legalpages)
 public={'form':dict(config['form']),'chatbot':{'enabled':False},'analytics':{'enabled':False}}
 public['form']['enabled']=bool(config['form']['enabled'] and config['legal']['approved'] and config['contact']['email'])
 public['form']['marketingEnabled']=bool(public['form']['enabled'] and config['form']['marketingEnabled'])
 if config['analytics']['enabled'] or config['chatbot']['enabled']:
  raise ValueError('Analytics/chatbot need a reviewed consent loader before enabling. IDs alone do not activate scripts.')
 (OUT/'assets/config.js').write_text('window.KSM_CONFIG='+json.dumps(public,ensure_ascii=False)+';')
 def field(f):
  key=f['key']; req=' required' if f['required'] else ''
  common=f'id="{key}" name="{key}" maxlength="{f["maxLength"]}"'+req
  label=esc(f['label'])+(' *' if f['required'] else ' (isteğe bağlı)')
  ac={'name':'name','company':'organization','email':'email','phone':'tel','website':'url'}.get(key,'off')
  if f.get('options'): control=f'<select {common}><option value="">Seçin</option>'+''.join(f'<option>{esc(x)}</option>' for x in f['options'])+'</select>'
  elif f.get('type')=='textarea':control=f'<textarea {common} rows="3"></textarea>'
  else:control=f'<input {common} type="{f.get("type","text")}" autocomplete="{ac}">'
  return f'<div class="field'+(' full' if f.get('type')=='textarea' else '')+f'"><label for="{key}">{label}</label>'+control+(f'<small>{esc(f["hint"])}</small>' if f.get('hint') else '')+'</div>'
 form='<form id="analysis-form" class="analysis-form" novalidate><p class="note" id="form-mode">'+('Formu doldurarak analiz talebinizi iletebilirsiniz.' if public['form']['enabled'] else 'Ön izleme: Form gönderimi henüz aktif değil. Lütfen bu sürümde gerçek kişisel bilgi girmeyin. Hiçbir talep gönderilmeyecektir.')+'</p><p>* işaretli alanlar zorunludur. Diğer bilgileri görüşmede paylaşabilirsiniz.</p><ol class="form-progress" aria-label="Form adımları"><li aria-current="step">1 · İşletmeniz</li><li>2 · Mevcut süreç</li><li>3 · İhtiyacınız</li></ol>'
 for step,title in [(1,'İşletmeniz ve iletişim'),(2,'Mevcut müşteri süreciniz'),(3,'İhtiyacınız ve beklentiniz')]:
  form+=f'<fieldset data-step="{step}"'+(' hidden' if step>1 else '')+f'><legend tabindex="-1">{title}</legend>'
  if step==2:form+='<p>Bu adım isteğe bağlıdır. Bilmediğiniz alanları boş bırakabilirsiniz.</p>'
  form+='<div class="formgrid">'+''.join(field(f) for f in schema['fields'] if f['step']==step)+'</div>'
  if step==3:
   form+='<div class="privacy-note"><h3>Verileriniz hakkında</h3><p>Formun canlı sürümünde, verdiğiniz bilgiler analiz talebini değerlendirmek ve sizinle bu talep hakkında iletişim kurmak için işlenecektir. <a href="/kvkk/" target="_blank" rel="noopener">KVKK Aydınlatma Metni (yeni sekme)</a> ve <a href="/gizlilik-politikasi/" target="_blank" rel="noopener">Gizlilik Politikası (yeni sekme)</a> gönderimden önce incelenebilir.</p><p>Sağlık verisi, kimlik numarası, şifre veya üçüncü kişilere ait bilgi paylaşmayın.</p><label class="check"><input type="checkbox" name="privacyAcknowledged" required><span>KVKK Aydınlatma Metni’ni okudum ve bilgilendirildim. *</span></label><p><small>Bu beyan, pazarlama izni veya veri işlemeye yönelik açık rıza değildir.</small></p><div class="marketing-choice"><h3>E-posta ile ticari ileti izni (isteğe bağlı)</h3><label class="check"><input type="checkbox" name="marketingEmail"'+('' if public['form']['marketingEnabled'] else ' disabled')+'><span>KSM DELTA’nın hizmet, kampanya ve etkinlikleri hakkında e-posta almak istiyorum. Bu tercihim analiz talebimin koşulu değildir; iznimi dilediğim zaman geri alabilirim.</span></label>'+('' if public['form']['marketingEnabled'] else '<p><small>Bu izin seçeneği henüz aktif değildir. Pazarlama iletişimi gönderilmez.</small></p>')+'</div></div>'
  form+='<div class="actions">'+('<button type="button" class="button light" data-prev>Geri</button>' if step>1 else '')+('<button type="button" class="button" data-next>'+('Devam et' if step==1 else 'İhtiyacınıza geçin')+'</button>' if step<3 else '<button type="submit" class="button" id="form-submit">'+('Analiz talebimi gönder' if public['form']['enabled'] else 'Formu kontrol et · Gönderim kapalı')+'</button>')+'</div></fieldset>'
 form+='<div class="honeypot" aria-hidden="true"><label for="companyFax">Bu alanı boş bırakın</label><input id="companyFax" name="companyFax" tabindex="-1" autocomplete="off"></div><div id="form-status" class="result" role="status" tabindex="-1" hidden></div><noscript><p>Çok adımlı form için JavaScript gerekir. Gönderim bu sürümde kullanıma kapalıdır.</p></noscript></form>'
 body=hero('Ücretsiz İşletme Analizi','İşletmenizi tanıyalım. Büyümeyi zorlaştıran noktaları birlikte belirleyelim.','ucretsiz-isletme-analizi')+section('<div class="form-layout"><aside><p class="eyebrow">Önce teşhis</p><h2>Doğru başlangıç,<br>doğru sorular.</h2><p>Önce iletişim bilgilerinizi ve işletmenizi, ardından mevcut sürecinizi ve ihtiyacınızı paylaşabilirsiniz.</p><p>Analiz talebi, hizmet satın alma veya pazarlama izni verme zorunluluğu doğurmaz.</p></aside>'+form+'</div>')
 render('ucretsiz-isletme-analizi','Ücretsiz İşletme Analizi','KSM DELTA işletme analizi: müşteri kazanımı, satış takibi ve müşteri bağlılığı ihtiyaçlarınızı üç kısa adımda paylaşın.',body)
 c=config['contact']
 email=(f'<a href="mailto:{esc(c["email"],quote=True)}">{esc(c["email"])}</a>' if c['email'] else '<span class="placeholder">'+esc(c['emailPlaceholder'])+'</span>')
 contact='<div class="grid two"><article class="card"><p class="eyebrow">Öncelikli iletişim kanalı</p><h2>E-posta</h2><p>'+email+'</p><p>İşletmeniz ve ihtiyacınız hakkında iletişim için öncelikli kanalımız e-posta olacaktır.</p></article><article class="card"><h2>İşletme analizi</h2><p>Müşteri kazanımı, satışa dönüşüm ve tekrar satın alma sürecinizi birlikte ele alalım.</p>'+ctx['button']()+'</article></div>'
 if c['showPhone'] and c['phone']:contact+='<p>Diğer iletişim seçeneği: <a href="tel:'+esc(c['phone'].replace(' ',''),quote=True)+'">'+esc(c['phone'])+'</a></p>'
 if c['whatsapp']:contact+='<p><a href="https://wa.me/'+''.join(x for x in c['whatsapp'] if x.isdigit())+'">WhatsApp</a></p>'
 if c['address']:contact+='<p>'+esc(c['address'])+'</p>'
 if c['socialLinks']:contact+='<ul>'+''.join('<li><a rel="noopener" href="'+esc(v,quote=True)+'">'+esc(k)+'</a></li>' for k,v in c['socialLinks'].items() if v.startswith('https://'))+'</ul>'
 render('iletisim','KSM DELTA ile iletişim','KSM DELTA ile e-posta üzerinden iletişim ve ücretsiz işletme analizi.',hero('İşletmenizin büyüme sürecini konuşalım.','KSM DELTA by KSM ONYX GRUP','iletisim')+section(contact))
 info=config['legal']
 def val(k):return esc(info.get(k) or '[TO BE CONFIRMED]')
 banner='<p class="note">TASLAK · Website implementation için hazırlanmıştır. Nihai yayından önce şirket bilgileri ve fiilî veri akışı tamamlanmalı, hukuk uzmanı tarafından incelenmelidir. Bu metin nihai hukuki onay anlamına gelmez.</p>'
 legal_content={
 'kvkk':f'''<h2>1. Veri sorumlusu ve kapsam</h2><p>KSM DELTA markası kapsamında veri sorumlusu: {val('dataController')}. Ticaret unvanı: {val('companyName')}. Adres: {val('registeredAddress')}. Başvuru kanalı: {val('privacyContact')}.</p><p>Bu taslak, Ücretsiz İşletme Analizi formunun planlanan kullanımı için hazırlanmıştır. Mevcut ön izleme sürümünde form gönderimi kapalıdır; alanlar sunucuya gönderilmez.</p><h2>2. Hangi bilgiler ve hangi amaçlarla?</h2><p>Canlı sürümde ad-soyad, şirket, sektör ve e-posta talebi değerlendirmek ve yanıtlamak için istenir. İsteğe bağlı telefon, web/Instagram adresi, aylık müşteri adayı sayısı, kaynaklar, CRM kullanımı, yanıt süresi ve takip bilgileri ilk görüşmeye hazırlanmak için kullanılır. Sorun, beklenen sonuç ve açıklama alanları ihtiyacı anlamaya yardımcı olur.</p><p>Talep kimliği, gönderim tarihi, durum, notlar ve aydınlatma metni sürümü talebin takibi ve bilgilendirmenin kaydı için tutulması planlanan alanlardır. İsteğe bağlı pazarlama e-posta izni, talep işleminden ayrı kaydedilir.</p><h2>3. Toplama yöntemi ve hukuki sebep</h2><p>Canlı sürümde bilgiler web formu ve talebe ilişkin sonraki görüşmeler yoluyla elektronik ortamda elde edilir. Talebin değerlendirilmesi, sözleşme öncesi süreç, güvenlik ve izin kayıtları için uygulanacak Kanun’un 5. maddesindeki hukuki sebepler, veri sorumlusu tarafından her amaçla eşleştirilerek kesinleştirilmelidir: [TO BE CONFIRMED]. Taslak, tüm işlemler için toplu açık rıza alındığı anlamına gelmez.</p><h2>4. Alıcılar ve yurt dışı aktarım</h2><p>Yetkili ekip ile hosting, form işleme, e-posta ve kayıt hizmeti sağlayıcılarının kapsamı: {val('recipientProviders')}. İlk kayıt hedefi Google Sheets olarak planlanmaktadır; şu anda bağlı değildir. Sağlayıcı ülkeleri, sözleşmeler ve uygulanacak yurt dışı aktarım mekanizması: {val('transferMechanism')}. Bu değerlendirme tamamlanmadan gerçek veri aktarımı başlatılmamalıdır.</p><h2>5. Saklama ve güvenlik</h2><p>Talep ve izin kayıtlarının saklama süresi ve silme politikası: {val('retentionPeriod')}. Erişimlerin görevle sınırlandırılması, HTTPS, sunucuda doğrulama ve sırların istemciye aktarılmaması teknik tasarımın parçalarıdır. Nihai önlemler kullanılan hizmetlerle birlikte doğrulanmalıdır.</p><h2>6. Haklar ve başvuru</h2><p>6698 sayılı Kanun’un 11. maddesi kapsamındaki haklarınıza ilişkin başvuruların iletileceği e-posta/KEP ve posta adresi: {val('privacyContact')}. Başvuru yöntemi ve kimlik doğrulama süreci yayından önce tamamlanmalıdır.</p>''',
 'gizlilik-politikasi':f'''<h2>1. Site ve sorumlu kuruluş</h2><p>Site: delta.ksmonyx.com. Marka: KSM DELTA by KSM ONYX GRUP. Sorumlu kuruluş: {val('companyName')}. İletişim: {val('privacyContact')}.</p><h2>2. Mevcut sürüm</h2><p>Form ön izlemesi tarayıcı belleğinde çalışır. Form alanları, analitik, reklam pikseli veya sohbet sağlayıcısına gönderilmez; localStorage içinde saklanmaz. Sayfa yenilendiğinde uygulama taslağı yeniden yüklemez; tarayıcınızın kendi otomatik doldurma davranışı farklı olabilir. Hosting sağlayıcısının erişim kayıtları ve güvenlik hizmetleri ayrıca değerlendirilmelidir: {val('hostingProvider')}.</p><h2>3. Form etkinleştirildiğinde</h2><p>Kimlik ve iletişim bilgileri ile işletme süreci hakkındaki yanıtlar, ücretsiz analiz talebini değerlendirmek için form işleyicisine iletilecektir. Amaçlar, hukuki sebepler, alıcılar ve saklama süresi KVKK Aydınlatma Metni’nde kesinleştirilmeden gönderim açılmamalıdır.</p><p>Serbest metin alanlarında sağlık bilgisi, kimlik numarası, şifre veya üçüncü kişilerin bilgilerini paylaşmayın. E-posta bildirimlerinde mümkün olduğunca yalnızca talep kimliği ve kayıt bağlantısı kullanılması planlanır.</p><h2>4. Pazarlama iletişimi</h2><p>Analiz talebiyle ilgili yanıt ile kampanya ve tanıtım iletileri ayrı amaçlardır. Pazarlama e-posta seçeneği varsayılan olarak kapalı ve isteğe bağlıdır. İzin yönetimi ve ret kanalı yayından önce tamamlanmalıdır; form talebi pazarlama iznine bağlanmaz.</p><h2>5. Hizmet sağlayıcıları ve bağlantılar</h2><p>Google Sheets, e-posta sağlayıcısı veya gelecekte seçilecek CRM için erişim, aktarım ve saklama koşulları ayrı değerlendirilir. Dış bağlantılar kendi gizlilik uygulamalarına tabidir. Nihai sağlayıcı envanteri: {val('recipientProviders')}.</p><h2>6. Güvenlik, saklama ve güncelleme</h2><p>Veri erişimi yetkilendirilmiş kişilerle sınırlandırılmalı; kayıtların yedeği, silinmesi ve ihlal müdahalesi için süreç tanımlanmalıdır. Saklama takvimi: {val('retentionPeriod')}. Analitik, reklam veya chatbot devreye alındığında bu politika ve ilgili bildirimler gerçek işleyişe göre güncellenir.</p><h2>7. Başvuru</h2><p>Gizlilikle ilgili başvuru kanalı: {val('privacyContact')}. Kişisel veri hakları için KVKK Aydınlatma Metni’ni inceleyin.</p>''',
 'cerez-politikasi':'''<h2>1. Kapsam</h2><p>Çerezler, tarayıcıda saklanabilen küçük kayıtlardır. Bu taslak yalnızca bu site sürümünün uygulama kodu ve planlanan ek servisleri hakkındadır.</p><h2>2. Mevcut uygulama envanteri</h2><ul><li>Uygulama tarafından yerleştirilen çerez: yok.</li><li>Analitik ve reklam pikseli: aktif değil.</li><li>Üçüncü taraf sohbet: aktif değil.</li><li>Form taslağı için localStorage veya sessionStorage: kullanılmıyor.</li></ul><p>Hosting/CDN/güvenlik katmanının çerez ve kayıt envanteri: [TO BE CONFIRMED]. Bu liste, sunucu ve alan adı üzerinde yapılacak yayına hazırlık kontrolünden sonra kesinleşir.</p><h2>3. Gelecekte eklenecek servisler</h2><p>Google Analytics, GTM üzerinden etiketler, Meta Pixel, LinkedIn Insight Tag veya chatbot eklenmeden önce sağlayıcı, çerez adı, amaç, süre ve veri aktarımı değerlendirilir. Gerekli olmayan servisler, uygulanabilir izin koşulları sağlanmadan yüklenmemelidir.</p><h2>4. Tercih yönetimi</h2><p>Gerekli olmayan çerezler etkinleştirildiğinde, kabul ve reddetme seçenekleri açıkça sunulmalı; tercihler sonradan değiştirilebilmelidir. Bu sürümde böyle servisler aktif olmadığından işlevsiz bir çerez onay bandı gösterilmez.</p><h2>5. Kontrol ve güncelleme</h2><p>Tarayıcı ayarlarınız üzerinden çerezleri silebilir veya sınırlandırabilirsiniz. Nihai envanter, saklama süreleri ve sağlayıcı bilgileri değiştiğinde bu metin güncellenir. Başvuru kanalı: [TO BE CONFIRMED].</p>''',
 'kullanim-sartlari':f'''<h2>1. Siteyi işleten</h2><p>KSM DELTA markasıyla siteyi işleten kuruluş: {val('companyName')}. MERSİS: {val('mersis')}. Vergi dairesi: {val('taxOffice')}. Vergi numarası: {val('taxNumber')}. Adres: {val('registeredAddress')}. İletişim: {val('privacyContact')}.</p><h2>2. Bilgilendirme ve hizmet kapsamı</h2><p>Site, müşteri kazanımı, satışa dönüşüm ve müşteri bağlılığına yönelik KSM DELTA yaklaşımını tanıtır. Ücretsiz analiz talebi satın alma, sözleşme veya uygulama taahhüdü oluşturmaz. Hizmet kapsamı, bedel, süre ve sorumluluklar ayrıca kararlaştırılır.</p><h2>3. Örnek sistemler</h2><p>Örnek akışlar, kurulabilecek süreçleri anlatan simülasyonlardır. Canlı CRM, WhatsApp, yapay zekâ veya otomasyon bağlantısı oldukları ileri sürülmez. İşletme analizi yapılmadan sonuç, kurulum süresi veya satış artışı garantisi verilmez.</p><h2>4. Kullanıcı tarafından paylaşılan içerik</h2><p>Yalnızca paylaşmaya yetkili olduğunuz bilgileri iletin. Zararlı yazılım, istenmeyen içerik, kimlik bilgisi veya özel nitelikli kişisel veri göndermeyin. Formu hizmeti aksatacak veya izinsiz erişim sağlayacak biçimde kullanmayın.</p><h2>5. İçerik ve dış bağlantılar</h2><p>Site içeriğinin kullanımına ilişkin hak sahipliği ve izin kapsamı nihai yayından önce doğrulanır. Dış sitelerin hizmet ve içerikleri kendi koşullarına tabidir.</p><h2>6. Değişiklikler ve hukuki inceleme</h2><p>İçerik ve hizmet kapsamı güncellenebilir. Emredici mevzuat kapsamındaki haklar saklıdır. Uygulanacak hukuk, uyuşmazlık hükümleri ve şirketin faaliyet modeline özgü şartlar hukuk uzmanı tarafından tamamlanmalıdır: [TO BE CONFIRMED].</p>'''
 }
 for slug,title in legalpages.items():render(slug,title+' — Taslak',title+' için website implementation taslağı. Nihai yayından önce hukuki inceleme gerektirir.',hero(title,'Taslak sürüm · 8 Eylül 2026',slug)+section('<div class="reading">'+banner+legal_content[slug]+'</div>'),noindex=True)
 # Link the actual draft documents in every footer and the legal hub.
 links='<ul class="legal-list">'+''.join(f'<li><a href="/{s}/">{t} · Taslak</a></li>' for s,t in legalpages.items())+'</ul>'
 for path in OUT.rglob('*.html'):
  text=path.read_text()
  if '</footer>' in text:
   text=text.replace('<h3>Keşfedin</h3>','<h3>Keşfedin</h3>').replace('<div class="footer-bottom">','<div class="legal-footer">'+links+'</div><div class="footer-bottom">')
   text=text.replace('<script src="/assets/site.js" defer>','<script src="/assets/config.js" defer></script><script src="/assets/site.js" defer>')
  if path.parent.name=='yasal-bilgiler':text=text.replace('<h2>Hazırlanacak metinler</h2>','<h2>İnceleme için hazırlanan taslaklar</h2>'+links)
  path.write_text(text)

