/**
 * 通用拖拽式可视化编辑器类型定义
 *
 * 设计目标：把「左侧组件库 → 中间画布拖拽 → 右侧属性面板 → 自动生成 JSON」
 * 做成 schema 驱动的通用编辑器，未来任何需要拼装 JSON 结构的场景都能复用。
 *
 * 核心概念：
 * - BlockSchema：可拖拽块定义（左侧组件库中展示，决定属性面板渲染什么字段）
 * - FormFieldSchema：单个字段定义（驱动右侧属性面板表单渲染）
 * - 块的 instances 按 targetArrayPath 分组存到画布，每组数量不超过 maxCount
 */

/**
 * 字段类型枚举
 * - string：单行文本
 * - number：数字
 * - textarea：多行文本
 * - select：下拉选择
 * - radio：单选按钮组
 * - image：图片素材选择（用 GalleryPickLink，acceptTypes 限定图片）
 * - url：URL 链接
 */
export type FormFieldType =
  | 'image'
  | 'number'
  | 'radio'
  | 'select'
  | 'string'
  | 'textarea'
  | 'url';

/**
 * 单个字段定义（驱动属性面板表单渲染）
 */
export interface FormFieldSchema {
  /** 字段名（在 payload 对象中的 key，支持 a.b.c 嵌套路径） */
  name: string;
  /** 中文标签 */
  label: string;
  /** 字段类型 */
  type: FormFieldType;
  /** 占位提示 */
  placeholder?: string;
  /** 是否必填 */
  required?: boolean;
  /** select / radio 类型的选项列表 */
  options?: { label: string; value: any }[];
  /** 图片字段：限定素材库文件类型（如 [0] 只显示图片） */
  acceptTypes?: number[];
  /** 最大长度 */
  maxLength?: number;
  /** 默认值 */
  defaultValue?: any;
}

/**
 * 可拖拽块定义（左侧组件库中展示，决定画布上能放什么块、各块有哪些字段）
 */
export interface BlockSchema {
  /** 块类型标识（唯一） */
  type: string;
  /** 块显示名（如「二级标题+文本项」「跳转链接项」） */
  label: string;
  /** 块图标（Iconify） */
  icon: string;
  /** 该块的字段定义（驱动右侧属性面板表单渲染） */
  fields: FormFieldSchema[];
  /**
   * 该块在最终 JSON 中放到的数组路径
   * 例如 'horizontal_content_list' 表示拖入的块实例会被收集到 result.horizontal_content_list 数组
   * 多个块共用同一个 targetArrayPath 即被收集到同一数组
   */
  targetArrayPath: string;
  /** 该数组路径下最多允许的块数量（如企微 jump_list 最多 3 项） */
  maxCount?: number;
  /** 块实例的默认值（拖入时初始化） */
  defaultValue?: Record<string, any>;
}

/**
 * 画布中的块实例（拖入后生成的实际数据）
 */
export interface BlockInstance {
  /** 块实例唯一 ID（用于 SortableJS 拖拽排序追踪） */
  id: string;
  /** 关联的块类型（对应 BlockSchema.type） */
  type: string;
  /** 块实例的当前数据（属性面板编辑后会更新这里） */
  data: Record<string, any>;
}

/**
 * 顶层固定字段（不可拖拽删除，固定显示在属性面板顶部）
 * 用于 card_type / main_title / source 等必填顶层字段
 */
export interface FixedField extends FormFieldSchema {
  /** 字段在最终 JSON 中的路径（支持 a.b.c 嵌套，如 'main_title.title'） */
  name: string;
}
