/* ============================================================
   Mock data + helpers (dates, status)
   ============================================================ */

function daysBetween(a, b) { return Math.round((b - a) / 86400000); }
function fmtDate(d) {
  if (!d) return "—";   // boş/null tarih → 1970 yerine tire
  return new Intl.DateTimeFormat("tr-TR", { day: "2-digit", month: "short", year: "numeric" }).format(d);
}
function addDays(d, n) { const x = new Date(d); x.setDate(x.getDate() + n); return x; }

// Gerçek "bugün" (gece yarısına yuvarlanmış). Gerçek verilerle certStatus + admin tarih filtresi
// doğru çalışsın diye sabit mock yerine canlı tarih kullanılır.
const TODAY = (function () { const n = new Date(); return new Date(n.getFullYear(), n.getMonth(), n.getDate()); })();

/* Sunucudan basılan gerçek veri (window.__BOOT__). Yoksa mock'a düşülür. */
const BOOT = (typeof window !== "undefined" && window.__BOOT__) || {};
const _D = s => (s ? new Date(s) : null);

/* Derive status from expiry */
function certStatus(expiry) {
  if (!expiry) return { key: "pending", label: "Beklemede", tone: "gray", left: null }; // henüz üretilmedi
  const left = daysBetween(TODAY, expiry);
  if (left < 0)  return { key: "expired",  label: "Süresi doldu",  tone: "red",   left };
  if (left <= 14) return { key: "expiring", label: "Yakında dolacak", tone: "amber", left };
  return { key: "active", label: "Aktif", tone: "green", left };
}

function mkCert(domain, issuedDaysAgo, opts = {}) {
  const issued = addDays(TODAY, -issuedDaysAgo);
  const expiry = addDays(issued, 90);
  return {
    id: domain.replace(/\W/g, "") + issuedDaysAgo,
    domain, issued, expiry,
    email: opts.email || ("yonetici@" + domain),
    autoReminder: opts.autoReminder !== false,
    www: opts.www !== false,
    ...opts,
  };
}

/* Customer's own certificates */
const MY_CERTS = Array.isArray(BOOT.myCerts) ? BOOT.myCerts.map(c => ({
  id: c.id, domain: c.domain, www: !!c.www, issued: _D(c.issued), expiry: _D(c.expiry),
  created: _D(c.created), state: c.state || "pending",
  email: c.email || "", autoReminder: c.autoReminder !== false,
})) : [
  mkCert("acmeyazilim.com", 12),
  mkCert("magaza.acmeyazilim.com", 78, { www: false }),
  mkCert("blog.kerimdesign.dev", 84),
  mkCert("eskiproje.net", 96, { autoReminder: false }),
];

/* Admin: all applications across users */
const ADMIN_APPS = (BOOT.adminOrders && Array.isArray(BOOT.adminOrders.rows)) ? BOOT.adminOrders.rows.map(r => ({
  id: r.id, domain: r.domain, user: r.user, created: _D(r.created), state: r.state, expiry: _D(r.expiry), reminder: r.reminder !== false,
  ownerCountry: r.ownerCountry || "", ownerCity: r.ownerCity || "", ownerOrg: r.ownerOrg || "", ownerUnit: r.ownerUnit || "",
  sartlarKabul: r.sartlarKabul === true, sartlarMetni: r.sartlarMetni || "", basvuruIp: r.basvuruIp || "",
})) : [
  { domain: "acmeyazilim.com",        user: "kerim@acmeyazilim.com", created: addDays(TODAY,-12), state: "issued",   expiry: addDays(TODAY,78) },
  { domain: "magaza.acmeyazilim.com", user: "kerim@acmeyazilim.com", created: addDays(TODAY,-78), state: "issued",   expiry: addDays(TODAY,12) },
  { domain: "blog.kerimdesign.dev",   user: "kerim@acmeyazilim.com", created: addDays(TODAY,-84), state: "issued",   expiry: addDays(TODAY,6) },
  { domain: "eskiproje.net",          user: "kerim@acmeyazilim.com", created: addDays(TODAY,-96), state: "issued",   expiry: addDays(TODAY,-6) },
  { domain: "yenidukkan.com.tr",      user: "(üyeliksiz)",            created: addDays(TODAY,0),   state: "pending",  expiry: null },
  { domain: "portfolyo.dev",          user: "ayse@portfolyo.dev",    created: addDays(TODAY,-1),  state: "verifying",expiry: null },
  { domain: "kliniksitesi.com",       user: "(üyeliksiz)",           created: addDays(TODAY,-2),  state: "issued",   expiry: addDays(TODAY,88) },
  { domain: "haberportali.net",       user: "mert@haber.net",        created: addDays(TODAY,-3),  state: "failed",   expiry: null },
  { domain: "okuldernegi.org",        user: "info@okuldernegi.org",  created: addDays(TODAY,-5),  state: "issued",   expiry: addDays(TODAY,85) },
  { domain: "kahvedukkani.co",        user: "(üyeliksiz)",           created: addDays(TODAY,-8),  state: "issued",   expiry: addDays(TODAY,82) },
];

const APP_STATE = {
  issued:    { label: "Yayınlandı",       tone: "green" },
  pending:   { label: "DNS bekliyor",     tone: "gray"  },
  verifying: { label: "Doğrulanıyor",     tone: "blue"  },
  failed:    { label: "Başarısız",        tone: "red"   },
  expired:   { label: "Süresi doldu",     tone: "red"   },
};

/* Sample DNS challenge records (DNS-01) */
const DNS_RECORDS = [
  { host: "_acme-challenge",      name: "_acme-challenge.{D}",     value: "H7490dwcm6MhBsZFuvWvEsdXkLe09_OItJ-9e2GVZzY" },
  { host: "_acme-challenge.www",  name: "_acme-challenge.www.{D}", value: "h6kXsDn0ox_Y57zrNG0pMAZQAQY8DieZJuyi_0GGImY" },
];

/* Account-key thumbprint (shared by all HTTP-01 challenges of this order) */
const ACME_THUMBPRINT = "u4N1aGxQwRzKpL9mB2fY7vTcEdHsJ0oUiMnRbVgCkXe";

/* Sample HTTP challenge tokens (HTTP-01). One per hostname.
   File lives at:  http://<host>/.well-known/acme-challenge/<token>
   File content :  <token>.<thumbprint>  (key authorization) */
const HTTP_CHALLENGES = [
  { host: "{D}",     token: "qX7m2Rk0pLdVtZ8nB3wYcF1aJ6gH9sUEoMrTbNhVi" },
  { host: "www.{D}", token: "Lp9Vt2ZcX8mQ7kB3wYnF1aJ6gH0sUEoMrThdNqXVr" },
];
const ACME_DIR = "/.well-known/acme-challenge/";

/* Files inside the downloaded bundle */
const BUNDLE_FILES = [
  { name: "certificate.crt",  desc: "Sunucu sertifikası",        size: "2.1 KB" },
  { name: "private.key",      desc: "Özel anahtar — gizli tutun", size: "1.7 KB", secret: true },
  { name: "ca_bundle.crt",    desc: "Ara sertifika zinciri",     size: "3.4 KB" },
  { name: "fullchain.pem",    desc: "Sertifika + zincir (Nginx)", size: "5.5 KB" },
  { name: "certificate.pfx",  desc: "IIS / Windows · PFX",       size: "4.2 KB", pfx: true },
];

// Ülke listesi sunucudan (__BOOT__.countries — Ulkeler.sql kaynaklı, 232 ülke) gelir; yoksa kısa yedek.
const COUNTRIES = (Array.isArray(BOOT.countries) && BOOT.countries.length)
  ? BOOT.countries
  : ["Türkiye","Almanya","Amerika Birleşik Devletleri","Birleşik Krallık","Hollanda","Fransa","Azerbaycan","Diğer"];

/* ---------------- Reports: expiring / expired ---------------- */
const REPORT_CERTS = (BOOT.report && (BOOT.report.expiringToday || BOOT.report.expired))
  ? [].concat(BOOT.report.expiringToday || [], BOOT.report.expired || []).map(c => ({ domain: c.domain, user: c.user, expiry: _D(c.expiry) }))
  : [
  { domain: "magaza.acmeyazilim.com", user: "kerim@acmeyazilim.com", expiry: addDays(TODAY, 0) },
  { domain: "kampanya.sirket.com",    user: "(üyeliksiz)",           expiry: addDays(TODAY, 0) },
  { domain: "panel.hizlistok.com",    user: "ayse@hizlistok.com",    expiry: addDays(TODAY, 0) },
  { domain: "blog.kerimdesign.dev",   user: "kerim@acmeyazilim.com", expiry: addDays(TODAY, 5) },
  { domain: "app.minimuhasebe.com",   user: "destek@minimuhasebe.com", expiry: addDays(TODAY, 3) },
  { domain: "eskiproje.net",          user: "kerim@acmeyazilim.com", expiry: addDays(TODAY, -6) },
  { domain: "demo.eskisite.org",      user: "(üyeliksiz)",           expiry: addDays(TODAY, -19) },
  { domain: "test.bayitakip.com",     user: "mert@bayitakip.com",    expiry: addDays(TODAY, -2) },
];

/* ---------------- Email log (reminders / notices) ---------------- */
const MAIL_TYPES = {
  ready:    { label: "Sertifika hazır",   tone: "blue"  },
  d30:      { label: "30 gün kala",        tone: "gray"  },
  d7:       { label: "7 gün kala",         tone: "amber" },
  d1:       { label: "1 gün kala",         tone: "amber" },
  expired:  { label: "Süre doldu",         tone: "red"   },
  renewed:  { label: "Yenileme onayı",     tone: "green" },
};
function mkMail(hoursAgo, to, domain, type, status) {
  return { at: new Date(TODAY.getTime() - hoursAgo * 3600000), to, domain, type, status };
}
const EMAIL_LOG_BASE = [
  mkMail(1,  "kerim@acmeyazilim.com",   "magaza.acmeyazilim.com", "d1",      "opened"),
  mkMail(2,  "ayse@hizlistok.com",      "panel.hizlistok.com",    "d1",      "delivered"),
  mkMail(4,  "destek@minimuhasebe.com", "app.minimuhasebe.com",   "d7",      "opened"),
  mkMail(7,  "info@okuldernegi.org",    "okuldernegi.org",        "ready",   "delivered"),
  mkMail(20, "kerim@acmeyazilim.com",   "blog.kerimdesign.dev",   "d7",      "delivered"),
  mkMail(26, "mert@bayitakip.com",      "test.bayitakip.com",     "expired", "opened"),
  mkMail(31, "kerim@acmeyazilim.com",   "eskiproje.net",          "expired", "delivered"),
  mkMail(49, "ada@kahvedukkani.co",     "kahvedukkani.co",        "renewed", "opened"),
  mkMail(54, "noreply@bozukadres.xyz",  "bozukadres.xyz",         "d30",     "failed"),
  mkMail(73, "destek@minimuhasebe.com", "app.minimuhasebe.com",   "d30",     "delivered"),
];

/* Spread additional traffic across the last 30 days for date-range reporting */
const MAIL_FILL = (() => {
  const recips = [
    ["kerim@acmeyazilim.com", "acmeyazilim.com"], ["ayse@portfolyo.dev", "portfolyo.dev"],
    ["info@okuldernegi.org", "okuldernegi.org"],  ["ada@kahvedukkani.co", "kahvedukkani.co"],
    ["mert@bayitakip.com", "test.bayitakip.com"], ["destek@minimuhasebe.com", "app.minimuhasebe.com"],
    ["yonetici@kliniksitesi.com", "kliniksitesi.com"], ["admin@yenidukkan.com.tr", "yenidukkan.com.tr"],
    ["info@haberportali.net", "haberportali.net"], ["ayse@hizlistok.com", "panel.hizlistok.com"],
  ];
  const types = ["ready", "d30", "d7", "d1", "expired", "renewed"];
  const stats = ["opened", "opened", "delivered", "delivered", "delivered", "failed"];
  const out = [];
  let seed = 7;
  const rnd = () => (seed = (seed * 1103515245 + 12345) % 2147483648) / 2147483648;
  for (let d = 0; d < 30; d++) {
    const n = Math.floor(rnd() * 3); // 0–2 extra mails per day
    for (let k = 0; k < n; k++) {
      const r = recips[Math.floor(rnd() * recips.length)];
      out.push(mkMail(d * 24 + Math.floor(rnd() * 22) + 2, r[0], r[1],
        types[Math.floor(rnd() * types.length)], stats[Math.floor(rnd() * stats.length)]));
    }
  }
  return out;
})();
const EMAIL_LOG = (BOOT.report && Array.isArray(BOOT.report.emails))
  ? BOOT.report.emails.map(m => ({ at: _D(m.at), to: m.to, domain: m.domain, type: m.type, status: m.status })).sort((a, b) => b.at - a.at)
  : [...EMAIL_LOG_BASE, ...MAIL_FILL].sort((a, b) => b.at - a.at);
const MAIL_STATUS = {
  opened:    { label: "Açıldı",       tone: "green" },
  delivered: { label: "Teslim edildi", tone: "blue"  },
  failed:    { label: "Başarısız",    tone: "red"   },
};

/* ---------------- Blog posts (SEO) ---------------- */
function slugifyTr(s) {
  const map = { ç: "c", ğ: "g", ı: "i", ö: "o", ş: "s", ü: "u", İ: "i" };
  return (s || "").toLowerCase().replace(/[çğıöşüİ]/g, c => map[c] || c).replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
}
/* Each category has its own archive page → its own slug + SEO */
const DEFAULT_CATS = [
  { name: "Kurulum", slug: "kurulum", title: "SSL Kurulum Rehberleri — cPanel, Nginx, Apache, IIS",
    desc: "Ücretsiz SSL sertifikanızı cPanel, Nginx, Apache ve IIS üzerinde adım adım kurun. HTTPS'e sorunsuz geçiş rehberleri.",
    intro: "Sertifikanızı sunucunuza yüklemek için platforma özel, adım adım kurulum rehberleri." },
  { name: "Güvenlik", slug: "guvenlik", title: "Web Güvenliği & SSL/TLS Rehberleri",
    desc: "HTTPS, TLS sürümleri, wildcard sertifikalar ve site güvenliği hakkında bilmeniz gereken her şey.",
    intro: "HTTPS, TLS ve sertifika güvenliği üzerine derinlemesine yazılar." },
  { name: "Rehber", slug: "rehber", title: "SSL Sertifikası Rehberleri ve İpuçları",
    desc: "SSL sertifikası oluşturma, doğrulama ve yenileme süreçleri için kapsamlı rehberler.",
    intro: "Baştan sona ücretsiz SSL sürecini anlatan kapsamlı rehberler." },
  { name: "Sorun Giderme", slug: "sorun-giderme", title: "SSL Hataları ve Çözümleri",
    desc: "\"Bağlantı güvenli değil\", karışık içerik ve sertifika zinciri gibi yaygın SSL hatalarının çözümleri.",
    intro: "Sık karşılaşılan SSL/HTTPS hatalarını adım adım giderin." },
  { name: "Haberler", slug: "haberler", title: "SSL & HTTPS Haberleri",
    desc: "Sertifika otoriteleri, tarayıcı politikaları ve Let's Encrypt hakkında güncel haberler.",
    intro: "Sertifika dünyasından güncel gelişmeler ve duyurular." },
];
function getCats() {
  try {
    const v = JSON.parse(localStorage.getItem("ssl_cats_v2") || "null");
    if (Array.isArray(v) && v.length) return v;
    const old = JSON.parse(localStorage.getItem("ssl_blog_cats") || "null");  // migrate legacy names
    if (Array.isArray(old) && old.length) {
      return old.map(n => DEFAULT_CATS.find(c => c.name === n) || { name: n, slug: slugifyTr(n), title: "", desc: "", intro: "" });
    }
  } catch (e) {}
  return DEFAULT_CATS.map(c => ({ ...c }));
}
function setCats(arr) { try { localStorage.setItem("ssl_cats_v2", JSON.stringify(arr)); } catch (e) {} }
function catBySlug(slug) { return getCats().find(c => c.slug === slug) || null; }
function catByName(name) { return getCats().find(c => c.name === name) || null; }
/* legacy helpers (names list) used by the editor Select + public list filter */
function getBlogCats() { return getCats().map(c => c.name); }
function setBlogCats(names) {
  const cur = getCats();
  setCats(names.map(n => cur.find(c => c.name === n) || { name: n, slug: slugifyTr(n), title: "", desc: "", intro: "" }));
}
const BLOG_CATS = getBlogCats();
function fmtDateLong(d) {
  return new Intl.DateTimeFormat("tr-TR", { day: "numeric", month: "long", year: "numeric" }).format(d);
}
const BLOG_POSTS = Array.isArray(BOOT.posts) ? BOOT.posts.map(p => ({
  id: p.id, status: p.status, category: p.category, title: p.title, slug: p.slug,
  focusKeyword: p.focusKeyword || "", metaTitle: p.metaTitle || "", metaDescription: p.metaDescription || "",
  excerpt: p.excerpt || "", author: p.author || "", date: _D(p.date), readMins: p.readMins || 0,
  tags: p.tags || [], views: p.views || 0, cover: p.cover || "",
})) : [
  {
    id: "p1", status: "published", category: "Kurulum",
    title: "cPanel'de Ücretsiz SSL Sertifikası Nasıl Yüklenir? (2026)",
    slug: "cpanel-ucretsiz-ssl-kurulumu",
    focusKeyword: "cpanel ssl kurulumu",
    metaTitle: "cPanel'de Ücretsiz SSL Kurulumu — Adım Adım Rehber (2026)",
    metaDescription: "cPanel'de ücretsiz SSL sertifikası nasıl yüklenir? CRT, KEY ve CA Bundle dosyalarını SSL/TLS yöneticisine ekleyerek HTTPS'i adım adım aktif edin.",
    excerpt: "CRT, KEY ve CA Bundle dosyalarınızı cPanel SSL/TLS yöneticisine ekleyerek sitenizi 5 dakikada HTTPS'e taşıyın.",
    author: "Admin", date: addDays(TODAY, -3), readMins: 6, tags: ["cPanel", "HTTPS", "Kurulum"],
    views: 2840,
  },
  {
    id: "p2", status: "published", category: "Kurulum",
    title: "Nginx'te SSL Sertifikası Kurulumu ve HTTP'den HTTPS'e Yönlendirme",
    slug: "nginx-ssl-kurulumu-https-yonlendirme",
    focusKeyword: "nginx ssl kurulumu",
    metaTitle: "Nginx SSL Kurulumu ve HTTPS Yönlendirme — Tam Rehber",
    metaDescription: "Nginx sunucu bloğuna ssl_certificate ve ssl_certificate_key tanımlayın, 301 ile HTTP'den HTTPS'e güvenli yönlendirme yapın. Örnek konfigürasyon dahil.",
    excerpt: "server bloğuna fullchain ve private key yollarını tanımlayıp 301 yönlendirme ile tüm trafiği HTTPS'e taşıyın.",
    author: "Admin", date: addDays(TODAY, -9), readMins: 7, tags: ["Nginx", "HTTPS"],
    views: 1910,
  },
  {
    id: "p3", status: "published", category: "Kurulum",
    title: "PFX Dosyası Nedir ve IIS'te SSL Nasıl Kurulur?",
    slug: "pfx-nedir-iis-ssl-kurulumu",
    focusKeyword: "pfx iis ssl kurulumu",
    metaTitle: "PFX Nedir? IIS'te SSL Sertifikası Kurulumu (Windows)",
    metaDescription: "PFX dosyası nedir, neden şifrelidir ve Windows IIS'te nasıl içe aktarılır? Sertifika ve özel anahtarı tek dosyada birleştiren PFX'i adım adım kurun.",
    excerpt: "Sertifika ve özel anahtarı tek şifreli dosyada birleştiren PFX'i IIS Yöneticisi'ne aktarın ve site binding'ini yapın.",
    author: "Admin", date: addDays(TODAY, -16), readMins: 5, tags: ["IIS", "PFX", "Windows"],
    views: 1320,
  },
  {
    id: "p4", status: "published", category: "Sorun Giderme",
    title: "\"Bu Bağlantı Güvenli Değil\" Hatası ve Çözümleri",
    slug: "baglanti-guvenli-degil-hatasi-cozumu",
    focusKeyword: "bağlantı güvenli değil hatası",
    metaTitle: "\"Bağlantı Güvenli Değil\" Hatası Nasıl Çözülür?",
    metaDescription: "Tarayıcıda \"Bağlantınız özel değil\" / NET::ERR_CERT hatası neden çıkar? Süresi dolan sertifika, eksik ara zincir ve karışık içerik sorunlarını giderin.",
    excerpt: "Süresi dolmuş sertifika, eksik CA zinciri ve karışık içerik (mixed content) hatalarını tek tek nasıl çözeceğinizi görün.",
    author: "Admin", date: addDays(TODAY, -24), readMins: 8, tags: ["Hata", "Tarayıcı"],
    views: 4150,
  },
  {
    id: "p5", status: "draft", category: "Güvenlik",
    title: "Wildcard SSL Sertifikası Nedir? Ne Zaman Kullanmalı?",
    slug: "wildcard-ssl-nedir",
    focusKeyword: "wildcard ssl nedir",
    metaTitle: "",
    metaDescription: "",
    excerpt: "Tek bir sertifikayla tüm alt alan adlarını (*.example.com) güvene almanın avantajları ve sınırları.",
    author: "Admin", date: addDays(TODAY, -1), readMins: 4, tags: ["Wildcard"],
    views: 0,
  },
];

/* ---------------- Site settings (admin) ---------------- */
const DEFAULT_SETTINGS = {
  // Genel
  siteName: "90 Day Free SSL",
  siteUrl: "https://90dayfreessl.com",
  tagline: "Ücretsiz · 90 gün geçerli SSL sertifikası",
  contactEmail: "destek@90dayfreessl.com",
  language: "Türkçe",
  timezone: "(GMT+03:00) İstanbul",
  // Sertifika
  defaultValidity: 90,
  keyType: "RSA 2048",
  defaultVerify: "DNS (TXT)",
  includeWww: true,
  allowGuest: true,
  autoRenew: false,
  // E-posta / hatırlatma
  reminders: true,
  remindDays: "30, 7, 1",
  senderName: "90 Day Free SSL",
  senderEmail: "noreply@90dayfreessl.com",
  smtpHost: "smtp.90dayfreessl.com",
  smtpPort: "587",
  smtpSsl: true,
  // Güvenlik
  recaptcha: true,
  rateLimit: 20,
  twoFA: false,
  forceHttps: true,
  // Blog / SEO
  metaTitleTpl: "%title% — 90 Day Free SSL",
  defaultMetaDesc: "Alan adınız için 90 gün geçerli ücretsiz SSL sertifikası oluşturun.",
  postsPerPage: 9,
  seoIndex: true,
  seoSitemap: true,
  gscCode: "",
  gaId: "",
  gtmId: "",
  ogImage: true,
  // Reklam (Google AdSense) — blog sayfaları
  adsEnabled: true,
  adsClient: "ca-pub-0000000000000000",
  // Görünüm
  themeColor: "#2f5cff",
  // Bakım
  maintenance: false,
};
function getSettings() {
  try { return { ...DEFAULT_SETTINGS, ...(JSON.parse(localStorage.getItem("ssl_settings") || "{}")) }; }
  catch (e) { return { ...DEFAULT_SETTINGS }; }
}
function setSettings(s) {
  try { localStorage.setItem("ssl_settings", JSON.stringify(s)); } catch (e) {}
  if (window.sslApi) window.sslApi.put("admin/settings", s).then(function (r) {
    if (window.sslToast) window.sslToast(r && r.ok ? "Ayarlar kaydedildi" : (r.error || "Kaydedilemedi"), r && r.ok);
  });
}
function resetSettings() {
  try { localStorage.removeItem("ssl_settings"); } catch (e) {}
  if (window.sslApi) window.sslApi.put("admin/settings", DEFAULT_SETTINGS);
}

Object.assign(window, {
  daysBetween, fmtDate, fmtDateLong, addDays, TODAY, certStatus, mkCert,
  MY_CERTS, ADMIN_APPS, APP_STATE, DNS_RECORDS, HTTP_CHALLENGES, ACME_THUMBPRINT, ACME_DIR, BUNDLE_FILES, COUNTRIES,
  REPORT_CERTS, EMAIL_LOG, MAIL_TYPES, MAIL_STATUS,
  BLOG_POSTS, BLOG_CATS, DEFAULT_CATS, getCats, setCats, catBySlug, catByName, getBlogCats, setBlogCats, slugifyTr,
  DEFAULT_SETTINGS, getSettings, setSettings, resetSettings,
});
