/**
 * cms blueprint · wiring seam for `@platform-modules/seo`.
 *
 * Thin host glue projecting a published ContentEntry into indexability + discoverability metadata.
 * Uses only real seo subpath exports — no invented module API.
 */
import type { ContentEntry } from '@platform-modules/content'
import { getCanonicalOrigin } from '@platform-modules/seo/canonical'
import { isIndexable, robotsValue } from '@platform-modules/seo/gate'
import { buildBreadcrumbList, serializeJsonLd } from '@platform-modules/seo/jsonld'
import { buildUrlEntry } from '@platform-modules/seo/sitemap'

export type CmsSiteConfig = {
  subdomain: string
  baseDomain: string
  customDomain?: string
  indexingEnabled: boolean
}

export type EntrySeoMetadata = {
  robots: 'index,follow' | 'noindex,nofollow'
  canonicalUrl: string
  sitemapEntry: ReturnType<typeof buildUrlEntry>
  jsonLd: string
}

function entryPath(entry: ContentEntry): string {
  return `/${entry.type}/${entry.slug}`
}

/** Project a content entry into SEO metadata the host renders (robots, canonical, sitemap, JSON-LD). */
export function projectEntrySeo(entry: ContentEntry, site: CmsSiteConfig): EntrySeoMetadata {
  const origin = getCanonicalOrigin({
    subdomain: site.subdomain,
    baseDomain: site.baseDomain,
    customDomain: site.customDomain,
  })
  const canonicalUrl = `${origin}${entryPath(entry)}`
  const indexable = isIndexable({ indexingEnabled: site.indexingEnabled }, { published: entry.status === 'published' })
  const robots = robotsValue(indexable)
  const sitemapEntry = buildUrlEntry(canonicalUrl, {
    lastmod: entry.updatedAt.toISOString(),
  })
  const jsonLd = serializeJsonLd(
    buildBreadcrumbList([
      { name: 'Home', url: origin },
      { name: entry.title, url: canonicalUrl },
    ]),
  )
  return { robots, canonicalUrl, sitemapEntry, jsonLd }
}
