/**
 * 项目统一的 JSON 结构类型（中心定义，避免各处复制 Record<string, any>）。
 *
 * 渐进策略：
 * - JsonObject：当前仍用 any 值以兼容深层 context 访问（.a.b.c）
 * - 新域模型请用 TaskContext / 明确 interface，少用 JsonObject
 * - 后续可把热点路径迁到 StrictJsonObject（unknown 值）
 */

/** 严格 JSON（推荐新代码） */
export type JsonPrimitive = string | number | boolean | null
export type StrictJson = JsonPrimitive | StrictJson[] | { readonly [key: string]: StrictJson }
export type StrictJsonObject = { [key: string]: StrictJson }

/**
 * 宽松 JSON 对象袋（兼容既有履约 context / 平台响应）。
 * 值使用 any 仅为兼容深层属性链；新增代码优先 TaskContext 或 StrictJsonObject。
 */
export type JsonObject = Record<string, any>

/** @deprecated 使用 JsonObject */
export type JsonRecord = JsonObject

export function isPlainObject(value: unknown): value is JsonObject {
  return Object.prototype.toString.call(value) === '[object Object]'
}

export function asJsonObject(value: unknown): JsonObject {
  return isPlainObject(value) ? value : {}
}

export function getJsonProp(value: unknown, key: string): unknown {
  if (!isPlainObject(value)) {
    return undefined
  }
  return value[key]
}
