import { packageStorage } from 'kody:runtime'
import type { ZendeskAuthInput, ZendeskStoredConfig } from './types.ts'
import { optionalString, requireRecord } from './types.ts'
import { missingSubdomainMessage, optionalSubdomain } from './setup.ts'
const CONFIG_KEY = 'config'
function asStoredConfig(value: unknown): ZendeskStoredConfig {
if (!value || typeof value !== 'object' || Array.isArray(value)) return {}
const record = value as Record<string, unknown>
return {
subdomain: optionalSubdomain(record.subdomain),
email: optionalString(record.email, 'email'),
}
}
export async function readStoredConfig(): Promise<ZendeskStoredConfig> {
try {
const stored = await packageStorage().get(CONFIG_KEY)
return asStoredConfig(stored)
} catch {
return {}
}
}
export async function writeStoredConfig(config: ZendeskStoredConfig): Promise<ZendeskStoredConfig> {
const next: ZendeskStoredConfig = {
subdomain: config.subdomain,
email: config.email,
}
await packageStorage().set(CONFIG_KEY, next)
return next
}
export async function resolveSubdomain(input: ZendeskAuthInput = {}): Promise<string> {
const fromInput = optionalSubdomain(input.subdomain)
if (fromInput) return fromInput
const stored = await readStoredConfig()
if (stored.subdomain) return stored.subdomain
throw new Error(missingSubdomainMessage(input))
}
export async function resolveEmail(input: ZendeskAuthInput = {}): Promise<string | undefined> {
const fromInput = optionalString(input.email, 'email')
if (fromInput) return fromInput
const stored = await readStoredConfig()
return stored.email
}
export async function resolveRuntimeConfig(input: ZendeskAuthInput = {}): Promise<{
subdomain: string
email?: string
}> {
const [subdomain, email] = await Promise.all([
resolveSubdomain(input).catch(() => undefined),
resolveEmail(input),
])
if (!subdomain) throw new Error(missingSubdomainMessage(input))
return { subdomain, email }
}
export function parseStoredConfigInput(params: Record<string, unknown>): ZendeskStoredConfig {
const input = requireRecord(params, 'configure')
return {
subdomain: optionalSubdomain(input.subdomain),
email: optionalString(input.email, 'email'),
}
}