import type { NzSafeAny } from 'ng-zorro-antd/core/types';
import { SFUISchemaItem } from './ui';
export type SFSchemaDefinition = Record<string, SFSchema>;
export interface SFSchemaEnum {
    [key: string]: NzSafeAny;
    /** 是否禁用状态 */
    disabled?: boolean;
    /** 文本 */
    label?: NzSafeAny;
    /** 文本 */
    title?: NzSafeAny;
    /** 值 */
    value?: NzSafeAny;
    /**
     * 主键，适用部分小部件数据键名，例如：`tree-select`
     */
    key?: NzSafeAny;
    /** 是否选中 */
    checked?: boolean;
    /**
     * 组名，适用部分允许组列表的小部件，例如：`select`
     * - 组对应的文本为 `label`
     * - `children` 为子项
     */
    group?: boolean;
    /**
     * Whether to hide item
     *
     * 是否隐藏项
     */
    hide?: boolean;
    isLeaf?: boolean;
    /** 组对应的子类 */
    children?: SFSchemaEnum[];
}
export type SFSchemaType = 'number' | 'integer' | 'string' | 'boolean' | 'object' | 'array';
export type SFSchemaEnumType = SFSchemaEnum | number | string | boolean;
/**
 * JSON Schema Form 结构体
 *
 * **注意：** 所有结构都以标准为基准，除了 `ui` 属性为非标准单纯只是为了更好的开发
 */
export interface SFSchema {
    [key: string]: NzSafeAny;
    /**
     * 数据类型，支持 JavaScript 基础类型；注意项：
     *
     * - `integer` 表示整型，`number` 表示浮点型
     * - JSON 中 `date` 等同 `string` 类型
     * - 指定 `format` 标准参数可以自动适配渲染小部件
     * - 指定 `widget` 参数强制渲染小部件
     */
    type?: SFSchemaType;
    /**
     * 枚举，静态数据源，例如：`radio`、`checkbox` 等
     *
     * - `disabled` 属性表示：禁用状态
     * - `label` 属性表示：文本
     * - `value` 属性表示：返回值
     * - 基础数据类型数组会自动转化成 `SFSchemaEnum` 数组格式
     */
    enum?: SFSchemaEnumType[];
    /**
     * 最小值
     */
    minimum?: number;
    /**
     * 约束是否包括 `minimum` 值
     */
    exclusiveMinimum?: boolean;
    /**
     * 最大值
     */
    maximum?: number;
    /**
     * 约束是否包括 `maximum` 值
     */
    exclusiveMaximum?: boolean;
    /**
     * 倍数
     */
    multipleOf?: number;
    /**
     * 定义字符串的最大长度
     */
    maxLength?: number;
    /**
     * 定义字符串的最小长度
     */
    minLength?: number;
    /**
     * 验证输入字段正则表达式字符串
     */
    pattern?: string;
    /**
     * 数组元素类型描述，只支持数组对象，若需要基础类型数组可通过其他部件支持
     *
     * ```json
     * items: {
     *   type: 'object',
     *   properties: {
     *     name: { type: 'string' },
     *     age: { type: 'number' }
     *   }
     * }
     * ```
     *
     * 结果
     *
     * ```json
     * [
     *   { "name": "cipchk1", "age": 18 },
     *   { "name": "cipchk2", "age": 16 }
     * ]
     * ```
     */
    items?: SFSchema;
    /**
     * 约束数组最小的元素个数
     * - `type="array"` 时有效
     */
    minItems?: number;
    /**
     * 约束数组最大的元素个数
     * - `type="array"` 时有效
     */
    maxItems?: number;
    /**
     * 约束数组每个元素都不相同
     * - `type="array"` 时有效
     */
    uniqueItems?: boolean;
    /**
     * 数组额外元素的校验规则
     */
    additionalItems?: SFSchema;
    /**
     * 最大属性个数，必须是非负整数
     */
    maxProperties?: number;
    /**
     * 最小属性个数，必须是非负整数
     */
    minProperties?: number;
    /**
     * 必填项属性
     */
    required?: string[];
    /**
     * 定义属性
     */
    properties?: Record<string, SFSchema>;
    /**
     * 条件验证
     * - 必须包含 `properties` 节点
     *  - 键名必须是当前节点 `properties` 值之一
     *  - 利用 `enum` 属性表示条件值，支持 `$ANY$` 表示任意值
     * - 不支持跨 Schema 节点
     * - 当条件成功会执行 `then` 否则执行 `else`
     * - `if`和`then` 是必须同时出现，`else` 可选项
     */
    if?: SFSchema;
    /**
     * 条件成功时执行
     * - 只支持 `required` 参数，用于表示显示
     */
    then?: SFSchema;
    /**
     * 条件失败时执行
     * - 只支持 `required` 参数，用于表示显示
     */
    else?: SFSchema;
    /** **不建议** 使用，可用 `required` 替代 */
    allOf?: SFSchema[];
    /** **不建议** 使用，可用 `required` 和 `minProperties` 替代 */
    anyOf?: SFSchema[];
    /** 值必须是其中之一 */
    oneOf?: SFSchema[];
    /**
     * 数据格式，[文档](http://json-schema.org/latest/json-schema-validation.html#rfc.section.7.3)
     * - `date-time` 日期时间，渲染为 `date`，[RFC3339](https://tools.ietf.org/html/rfc3339#section-5.6)
     * - `date`、`full-date` 日期，渲染为 `date`
     * - `time`、`full-time` 时间，渲染为 `time`
     * - `email` Email格式，渲染为 `autocomplete`
     * - 非标准：`week`，渲染为 `nz-week-picker`
     * - 非标准：`month`，渲染为 `nz-month-picker`
     * - `ip` IP地址，渲染为 `input`
     * - `uri` URL地址，渲染为 `upload`
     * - `mobile` 手机号
     * - `id-card` 身份证
     * - `color` 颜色值
     */
    format?: string;
    /**
     * 属性描述，相当于 `label` 值，按以下规则展示：
     * - 当值为 `null`、`undefined` 时使用 `key` 替代
     * - 当值为 `''` 空字符串表示不展示 `label` 部分，例如：`checkbox` 可能需要
     */
    title?: string | null;
    /**
     * 属性目的性解释
     */
    description?: string;
    /**
     * 默认值
     */
    default?: NzSafeAny;
    /**
     * 是否只读状态
     */
    readOnly?: boolean;
    /** 内部类型定义体 */
    definitions?: SFSchemaDefinition;
    /** 引用定义体 */
    $ref?: string;
    /** 针对开发者的注释，无任何意义，也不会被校验 */
    $comment?: string;
    /** **唯一非标准：** 指定UI配置信息，优先级高于 `sf` 组件 `ui` 属性值 */
    ui?: SFUISchemaItem | string;
}
