/**
 * System prompt assembly — system-ai.
 * Assembles the final system prompt: base (admin) → personality (tenant) → override (tenant).
 * Tenant text only appends; it can never replace the admin base.
 */
import { getGlobalConfig, getTenantSettings } from '@zync/db/queries'
import type { Db } from '@zync/db/queries'
import type { AIUseCase } from './use-cases'

const MAX_PERSONALITY_CHARS = 500
const MAX_OVERRIDE_CHARS = 300

/**
 * Assemble the system prompt for an AI call.
 * Order: base → personality → override (joined by blank lines).
 * Tenant inputs are defensively truncated if somehow stored over limit.
 */
export async function assembleSystemPrompt(
  db: Db,
  tenantId: string,
  useCase: AIUseCase,
): Promise<string> {
  const [config, settings] = await Promise.all([
    getGlobalConfig(db),
    getTenantSettings(db, tenantId),
  ])

  const parts: string[] = []

  // Base: admin-configured use-case prompt (required floor)
  const base = config.useCasePrompts[useCase]
  if (base) {
    parts.push(base.trim())
  }

  // Personality: tenant-configured tone/style (appended, never substitutes)
  if (settings.personalityPrompt) {
    let personality = settings.personalityPrompt.trim()
    if (personality.length > MAX_PERSONALITY_CHARS) {
      console.warn(
        `[AI] Tenant ${tenantId} personality prompt exceeds ${MAX_PERSONALITY_CHARS} chars (stored: ${personality.length}); truncating.`,
      )
      personality = personality.slice(0, MAX_PERSONALITY_CHARS)
    }
    if (personality) parts.push(personality)
  }

  // Per-use-case override: tenant-configured additional instructions
  const override = settings.useCaseOverrides[useCase]
  if (override) {
    let overrideTrimmed = override.trim()
    if (overrideTrimmed.length > MAX_OVERRIDE_CHARS) {
      console.warn(
        `[AI] Tenant ${tenantId} use_case_override for '${useCase}' exceeds ${MAX_OVERRIDE_CHARS} chars (stored: ${overrideTrimmed.length}); truncating.`,
      )
      overrideTrimmed = overrideTrimmed.slice(0, MAX_OVERRIDE_CHARS)
    }
    if (overrideTrimmed) parts.push(overrideTrimmed)
  }

  return parts.join('\n\n')
}
