import crypto from 'crypto'

/**
 * H5 APP 密钥容器（§4.1 修订补遗）。
 *
 * app_secrets JSON 结构：{ "com.peiban.app": { name: "陪伴 APP", secret: "sk_xxx" } }
 * 每个 APP 一个独立 HMAC 密钥，互不影响。
 */
export interface AppSecretEntry {
  /** 人类可读名称（owner 添加时输入，如「陪伴 APP」） */
  name: string
  /** HMAC 密钥（Forge 生成，交给 APP 后端签 JWT 用） */
  secret: string
  /** 可选：该 APP 的品牌主题预设 ID（P2.5 预设化）。未设置则用 H5 默认主题。 */
  themePreset?: string
}

/** appId → entry 映射 */
export type AppSecrets = Record<string, AppSecretEntry>

/** 生成新密钥（sk_ + 24 字符随机串） */
export function generateSecret(): string {
  return 'sk_' + crypto.randomBytes(12).toString('base64url')
}

/** 生成新 slug（6 字符随机串，URL 标识） */
export function generateSlug(): string {
  return crypto.randomBytes(4).toString('base64url').slice(0, 6)
}

/** 解析 app_secrets JSON，失败返回空对象 */
export function parseAppSecrets(json: string): AppSecrets {
  try {
    const parsed = JSON.parse(json) as AppSecrets
    if (!parsed || typeof parsed !== 'object') return {}
    return parsed
  } catch {
    return {}
  }
}

/** 序列化回 JSON 字符串（存储用） */
export function serializeAppSecrets(secrets: AppSecrets): string {
  return JSON.stringify(secrets)
}

/** 按 iss(app_id) 取密钥；不存在返回 null */
export function getSecretByIss(secrets: AppSecrets, iss: string): string | null {
  const entry = secrets[iss]
  return entry?.secret ?? null
}

/** 按 iss 取展示名；不存在返回 iss 本身（降级显示） */
export function getNameByIss(secrets: AppSecrets, iss: string): string {
  return secrets[iss]?.name ?? iss
}

/** 添加 APP */
export function addApp(
  secrets: AppSecrets,
  appId: string,
  name: string,
  secret?: string,
): AppSecrets {
  return {
    ...secrets,
    [appId]: { name, secret: secret ?? generateSecret() },
  }
}

/** 更新 APP 名称（不改密钥） */
export function updateAppName(secrets: AppSecrets, appId: string, name: string): AppSecrets {
  if (!secrets[appId]) return secrets
  return { ...secrets, [appId]: { ...secrets[appId], name } }
}

/** 轮换密钥 */
export function rotateSecret(secrets: AppSecrets, appId: string): AppSecrets {
  if (!secrets[appId]) return secrets
  return { ...secrets, [appId]: { ...secrets[appId], secret: generateSecret() } }
}

/** 移除 APP */
export function removeApp(secrets: AppSecrets, appId: string): AppSecrets {
  const { [appId]: _removed, ...rest } = secrets
  return rest
}

/** 设置 APP 主题预设（存预设 ID，不动 name/secret） */
export function setAppThemePreset(secrets: AppSecrets, appId: string, presetId: string): AppSecrets {
  if (!secrets[appId]) return secrets
  return { ...secrets, [appId]: { ...secrets[appId], themePreset: presetId } }
}

/** 清除 APP 主题预设（恢复用 H5 默认主题） */
export function clearAppThemePreset(secrets: AppSecrets, appId: string): AppSecrets {
  if (!secrets[appId]) return secrets
  const { themePreset: _p, ...rest } = secrets[appId]
  return { ...secrets, [appId]: rest }
}

/** 按 iss(app_id) 取主题预设 ID；未设置返回 null */
export function getPresetIdByIss(secrets: AppSecrets, iss: string): string | null {
  return secrets[iss]?.themePreset ?? null
}
