/**
 * Public catalog query helpers — public-catalog-page (wave-11 leaf C).
 *
 * Unauthenticated path: resolve catalog_shares + catalog_templates by public_token.
 * No writes — read-only.
 */
import { and, eq } from 'drizzle-orm'
import type { Db } from '../client'
import { catalogShares } from '../schema/catalog'
import { catalogTemplates } from '../schema/catalog'

// ── Types ─────────────────────────────────────────────────────────────────────

export interface CatalogPublicData {
  shareId: string
  tenantId: string
  templateId: string
  content: unknown
  settings: unknown
  utmSource: string | null
  utmMedium: string | null
  utmCampaign: string | null
}

// ── Queries ───────────────────────────────────────────────────────────────────

export async function getCatalogShareByToken(
  db: Db,
  publicToken: string,
): Promise<CatalogPublicData | null> {
  const shareRows = await db
    .select()
    .from(catalogShares)
    .where(and(eq(catalogShares.publicToken, publicToken), eq(catalogShares.isActive, true)))
    .limit(1)

  if (shareRows.length === 0) return null
  const share = shareRows[0]!

  const templateRows = await db
    .select()
    .from(catalogTemplates)
    .where(
      and(
        eq(catalogTemplates.id, share.templateId),
        eq(catalogTemplates.tenantId, share.tenantId),
        eq(catalogTemplates.isActive, true),
      ),
    )
    .limit(1)

  if (templateRows.length === 0) return null

  return {
    shareId: share.id,
    tenantId: share.tenantId,
    templateId: share.templateId,
    content: templateRows[0]!.content,
    settings: share.settings,
    utmSource: share.utmSource ?? null,
    utmMedium: share.utmMedium ?? null,
    utmCampaign: share.utmCampaign ?? null,
  }
}
