// ============================================================
// KENNISBANK DATA · single source of truth
// ------------------------------------------------------------
// Add a new blog: append an entry to KB_ITEMS below, then create
// kennisbank/<slug>.html with just <BlogBody> + FAQ. Everything
// else (SEO, JSON-LD, hub card) is derived from this file.
// ============================================================

const KB_TYPES = {
  blog: {
    label: 'Blog',
    color: '#C2620A',           // tint-orange (readable on light bg)
    bg:    '#FFF3E4',
    accent:'#FB993F',
  },
  podcast: {
    label: 'Podcast',
    color: '#B42555',           // tint-pink
    bg:    '#FFE4EE',
    accent:'#F83C72',
  },
  tool: {
    label: 'Tool',
    color: '#5E1D8F',           // tint-purple
    bg:    '#F3E4FF',
    accent:'#4D01B4',
  },
  video: {
    label: 'Video',
    color: '#8A6300',           // amber-deep
    bg:    '#FFF7DF',
    accent:'#FFC031',
  },
};

// Helper · format a YYYY-MM-DD date as Dutch long.
function kbFormatDate(iso) {
  if (!iso) return '';
  const months = ['januari','februari','maart','april','mei','juni','juli','augustus','september','oktober','november','december'];
  const d = new Date(iso);
  if (isNaN(d.getTime())) return iso;
  return `${d.getDate()} ${months[d.getMonth()]} ${d.getFullYear()}`;
}

// ============================================================
// KB_ITEMS · every blog/podcast/tool/video lives here.
// ------------------------------------------------------------
//  REQUIRED: slug, type, title, date, href
//  OPTIONAL:
//    excerpt           — shown on hub card + as default meta description
//    author            — name (string)
//    readingMinutes    — number; powers "X min lezen"
//    tags              — array of strings; first one shows on card tail
//    cover             — { paletteId, variant } to pin a specific look
//    seo               — overrides for SEO meta tags:
//      title           — different <title> than the visible H1 (often
//                        more keyword-rich for search). Falls back to title.
//      description     — overrides excerpt for meta description.
//      keywords        — comma-separated for <meta keywords>.
//      ogTitle         — overrides og:title / twitter:title.
//      ogDescription   — overrides og:description / twitter:description.
// ============================================================
const KB_ITEMS = [
  {
    slug: 'groeien-zonder-extra-mensen',
    type: 'blog',
    title: 'Je hebt genoeg werk. Niet genoeg mensen. En een nieuwe vacature lost dat niet op.',
    excerpt: 'Veel MKB-ondernemers lopen vast omdat het werk sneller groeit dan het team. Waarom meer mensen aannemen zelden de oplossing is, en wat wel werkt.',
    date: '2026-05-21',
    author: 'Sil de Veer',
    readingMinutes: 5,
    tags: ['MKB groei', 'Capaciteit', 'Automatisering'],
    href: 'kennisbank/groeien-zonder-extra-mensen.html',
    seo: {
      title: 'Te veel werk, te weinig mensen? Zo groeit jouw MKB-bedrijf zonder extra personeel',
      keywords: 'te weinig personeel MKB, groeien zonder extra mensen, werk automatiseren MKB, digitale medewerker MKB, MKB bedrijf laten groeien',
      ogDescription: 'Waarom meer mensen aannemen zelden de oplossing is, en wat wél werkt.',
    },
  },
];

// ============================================================
// Lookup helper.
// ============================================================
function kbGetBlog(slug) {
  const found = (KB_ITEMS || []).find(i => i.slug === slug);
  if (!found) {
    console.warn(`[kennisbank] No blog found for slug "${slug}". Add it to KB_ITEMS in kennisbank_data.jsx.`);
    return { slug, type: 'blog', title: 'Onbekend artikel', date: '', author: 'Repetive', readingMinutes: 0, excerpt: '' };
  }
  return found;
}

// ============================================================
// SEO injection · runs at blog load time. Sets <title> and
// appends meta + OG + twitter + JSON-LD Article tags derived
// from the KB_ITEMS entry. No duplication in the HTML file.
// ============================================================
function kbInjectBlogSeo(blog) {
  if (!blog || !blog.slug) return;
  const seo = blog.seo || {};
  const displayTitle = blog.title || '';
  const seoTitle     = seo.title || displayTitle;
  const description  = seo.description || blog.excerpt || '';
  const ogTitle      = seo.ogTitle || seoTitle;
  const ogDescription = seo.ogDescription || description;
  const keywords     = seo.keywords || (blog.tags || []).join(', ');
  const author       = blog.author || 'Repetive';

  // <title>
  document.title = `${seoTitle} · Repetive`;

  // meta · upsert by name/property
  const head = document.head;
  const upsertMeta = (attrs) => {
    const key = attrs.name ? `name="${attrs.name}"` : `property="${attrs.property}"`;
    let el = head.querySelector(`meta[${key}]`);
    if (!el) {
      el = document.createElement('meta');
      Object.entries(attrs).forEach(([k, v]) => { if (k !== 'content') el.setAttribute(k, v); });
      head.appendChild(el);
    }
    el.setAttribute('content', attrs.content);
  };

  upsertMeta({ name: 'description', content: description });
  if (keywords) upsertMeta({ name: 'keywords', content: keywords });
  upsertMeta({ name: 'author', content: author });
  upsertMeta({ property: 'og:type', content: 'article' });
  upsertMeta({ property: 'og:title', content: ogTitle });
  upsertMeta({ property: 'og:description', content: ogDescription });
  upsertMeta({ property: 'og:site_name', content: 'Repetive · Kennisbank' });
  upsertMeta({ name: 'twitter:card', content: 'summary_large_image' });
  upsertMeta({ name: 'twitter:title', content: ogTitle });
  upsertMeta({ name: 'twitter:description', content: ogDescription });

  // JSON-LD Article — remove any prior auto-injected one first.
  head.querySelectorAll('script[data-kb-ld="article"]').forEach(el => el.remove());
  const ld = document.createElement('script');
  ld.type = 'application/ld+json';
  ld.dataset.kbLd = 'article';
  ld.textContent = JSON.stringify({
    '@context': 'https://schema.org',
    '@type': 'Article',
    headline: displayTitle,
    description: description,
    author: { '@type': 'Person', name: author },
    publisher: { '@type': 'Organization', name: 'Repetive' },
    datePublished: blog.date,
    inLanguage: 'nl',
  });
  head.appendChild(ld);
}

// ============================================================
// FAQ JSON-LD injection · pass the FAQ array used in the blog.
// Idempotent — re-runs cleanly on re-render.
// ============================================================
function kbInjectBlogFaqSeo(faq) {
  document.head.querySelectorAll('script[data-kb-ld="faq"]').forEach(el => el.remove());
  if (!Array.isArray(faq) || !faq.length) return;
  const ld = document.createElement('script');
  ld.type = 'application/ld+json';
  ld.dataset.kbLd = 'faq';
  ld.textContent = JSON.stringify({
    '@context': 'https://schema.org',
    '@type': 'FAQPage',
    mainEntity: faq.map(item => ({
      '@type': 'Question',
      name: item.q,
      acceptedAnswer: { '@type': 'Answer', text: typeof item.a === 'string' ? item.a : '' },
    })),
  });
  document.head.appendChild(ld);
}

Object.assign(window, {
  KB_TYPES,
  KB_ITEMS,
  kbFormatDate,
  kbGetBlog,
  kbInjectBlogSeo,
  kbInjectBlogFaqSeo,
});
