/**
 * cms blueprint · wiring seam for `@platform-modules/content` + `@platform-modules/db`.
 *
 * Host-owned glue: reconstruct content_entries from the schema the consumer owns and return a
 * Querier handle. Actor seeds mirror the auth principals the composition proof exercises.
 */
import { PGlite } from '@electric-sql/pglite'
import { drizzle } from 'drizzle-orm/pglite'
import type { Principal } from '@platform-modules/auth'
import type { Querier } from '@platform-modules/db'
import { contentSchema, type Actor, type ContentSchema } from '@platform-modules/content'
import { contentRevisionsMigrationSql } from '@platform-modules/content/revisions'
import { contentTaxonomyMigrationSql } from '@platform-modules/content/taxonomy'

export type ContentDb = Querier<ContentSchema>

export type SeededContent = {
  db: ContentDb
  client: PGlite
  /** Editor principal mapped to a publish-capable content Actor. */
  editorActor: Actor
  /** Author principal without publish — object-level authz rejects publish. */
  authorActor: Actor
}

/** Map auth Principal capabilities into content's capability-based Actor (no role model in the module). */
export function actorFromPrincipal(principal: Principal): Actor {
  const caps = principal.capabilities ?? []
  return {
    id: principal.userId,
    canEditAny: caps.includes('content:edit-any'),
    canPublish: caps.includes('content:publish'),
  }
}

export async function createContentDb(): Promise<SeededContent> {
  const client = new PGlite()
  const db = drizzle(client, { schema: contentSchema }) as unknown as ContentDb
  await client.exec(`
    CREATE TABLE content_entries (
      id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
      slug text NOT NULL,
      type text NOT NULL,
      title text NOT NULL,
      body text NOT NULL DEFAULT '',
      status text NOT NULL DEFAULT 'draft',
      visibility text NOT NULL DEFAULT 'public',
      published_at timestamptz(3),
      author text NOT NULL,
      category jsonb NOT NULL DEFAULT '[]'::jsonb,
      tag jsonb NOT NULL DEFAULT '[]'::jsonb,
      created_at timestamptz(3) NOT NULL DEFAULT NOW(),
      updated_at timestamptz(3) NOT NULL DEFAULT NOW()
    );
    CREATE UNIQUE INDEX content_entries_type_slug_uq ON content_entries (type, slug);
  `)
  // U2 revisions + U4 hierarchical taxonomy: the store JOINs content_entry_terms→content_terms to
  // load entry.terms, and the taxonomy migration ALTERs content_revisions — so revisions runs first.
  await client.exec(contentRevisionsMigrationSql())
  await client.exec(contentTaxonomyMigrationSql())
  return {
    db,
    client,
    editorActor: { id: 'editor-1', canEditAny: true, canPublish: true },
    authorActor: { id: 'author-2' },
  }
}
