type integer = number;

export interface BaseSchema {
    type?: string;
    format?: string;
    name?: string;
    description?: string;
    required?: boolean;
    nullable?: boolean;
}

export interface BooleanSchema extends BaseSchema {
    type: 'boolean';
    defaultValue?: boolean;
}

export interface IntegerSchema extends BaseSchema {
    type: 'integer';
    format?: 'byte' | 'short' | 'int' | 'long';
    defaultValue?: integer;
    minimum?: integer;
    maximum?: integer;
}

export interface NumberSchema extends BaseSchema {
    type: 'number';
    format?: 'float' | 'double' | 'decimal';
    defaultValue?: number;
    minimum?: number;
    maximum?: number;
}

export interface StringSchema extends BaseSchema {
    type: 'string';
    format?: 'byte' | 'binary' | 'blob' | 'uuid' | 'date' | 'time' | 'date-time' | 'enum' | 'password' | 'phone-number' | 'email';
    defaultValue?: string;
    minLength?: number;
    maxLength?: number;
}

export interface ArraySchema extends BaseSchema {
    type: 'array';
    items: Schema;
}

export interface SetSchema extends BaseSchema {
    type: 'set';
    items: Schema;
}
export interface MapSchema extends BaseSchema {
    type: 'map';
    key: Schema;
    value: Schema;
}

export interface ObjectSchema extends BaseSchema {
    type: 'object';
    propertyList: Array<Schema>;
}

export interface EnumItemSchema {
    label: string,
    value: string,
}

export interface EnumSchema extends BaseSchema {
    type: 'enum';
    enumItemList: Array<EnumItemSchema>;
}

/**
 * 明确一下：有 $ref 时，没有 type；有 type 时，没有 $ref。两者互斥！
 */
export interface RefSchema extends BaseSchema {
    $ref: string;
    /**
     * 当前这一版先用 isArray 来处理数组类型
     */
    isArray?: boolean;
}

export interface BasicSchema extends BaseSchema {
    type: 'boolean' | 'integer' | 'number' | 'string';
    format?: string;
    defaultValue?: any;
    minimum?: integer;
    maximum?: integer;
}

export interface BasicRefSchema extends BaseSchema {
    type?: 'boolean' | 'integer' | 'number' | 'string' | 'array' | 'set' | 'map' | 'object' | 'enum' | string;
    format?: string;
    defaultValue?: any;
    minimum?: integer;
    maximum?: integer;
    $ref?: string;
    isArray?: boolean;
}

export interface Schema extends BaseSchema {
    id?: string;
    type?: 'boolean' | 'integer' | 'number' | 'string' | 'array' | 'set' | 'map' | 'object' | 'enum' | string;
    format?: string;
    defaultValue?: any;
    minimum?: integer;
    maximum?: integer;
    items?: Schema;
    propertyList?: Array<Schema>;
    typeKey?: string;

    typeName?: string;
    typeParamValue?: Schema;
    typeParams?: Array<Schema>;
    typeInstantiation?: Schema;
    typeParamName?: string;
    /**
     * @deprecated
     * 在后续的迭代中去掉它
     */
    properties?: { [name: string]: Schema };
    enumItemList?: Array<EnumItemSchema>;
    relationship?: string;
    /**
     * @deprecated
     * 在后续的迭代中去掉它
     */
    enumItems?: { [name: string]: string };
    $ref?: string;
    isArray?: boolean;
    isLeaf?: boolean;
}

export default Schema;
