import type { ButtonBuilder, ChannelMultiSelectBuilder, ChannelSelectBuilder, CheckboxesBuilder, DatePickerBuilder, DateTimePickerBuilder, ExternalMultiSelectBuilder, ExternalSelectBuilder, FileInputBuilder, RadioButtonsBuilder, StaticMultiSelectBuilder, StaticSelectBuilder, TextInputBuilder, TimePickerBuilder, UserMultiSelectBuilder, UserSelectBuilder } from '../../elements';
import type { DividerBuilder, HeaderBuilder, InputBuilder, SectionBuilder } from '../../blocks';
import { EmailInputBuilder, NumberInputBuilder, URLInputBuilder } from '../../elements';
import { DirectorySelectBuilder } from '../../elements/directory-select';
import { OneSSelectBuilder } from '../../elements/one-s-select';
import { IPluginModalMeta } from '../../plugin/modal/plugin-modal-meta.builder';
import { ImageSelectBuilder } from '../../elements/image-select';
import { DateRangePickerBuilder } from '../../elements/date-range-picker';
import { DirectoryName } from '../../directory';
import { AddableInputBuilder } from '../../elements/addable-input';
import { Prop } from '../constants';
import { AxiosRequestConfig } from 'axios';
export * from './modal.types';
export * from './plugin.types';
export type SectionElementBuilder = ButtonBuilder;
export type InputElementBuilder = ChannelMultiSelectBuilder | ChannelSelectBuilder | CheckboxesBuilder | DatePickerBuilder | DateTimePickerBuilder | EmailInputBuilder | ExternalMultiSelectBuilder | ExternalSelectBuilder | NumberInputBuilder | RadioButtonsBuilder | StaticMultiSelectBuilder | StaticSelectBuilder | TextInputBuilder | TimePickerBuilder | URLInputBuilder | UserMultiSelectBuilder | UserSelectBuilder | FileInputBuilder
/** Новые виды */
 | DirectorySelectBuilder | OneSSelectBuilder | ImageSelectBuilder | DateRangePickerBuilder | AddableInputBuilder;
export type BlockBuilder = DividerBuilder | HeaderBuilder | InputBuilder | SectionBuilder;
export type ViewBlockBuilder = BlockBuilder;
export type FilterString = 'im' | 'mpim' | 'private' | 'public';
export type OneSSelectType = 'position' | 'depts';
export type ElementTeamParams = {
    type: 'current';
} | {
    type: 'all';
} | {
    type: 'id';
    id: string;
};
export type FetchValuesParams = {
    url: string;
    config?: AxiosRequestConfig;
};
export interface ObjectLiteral {
    [key: string]: any;
}
export type Ctor<T = Record<string, unknown>> = new (...args: any[]) => T;
export type AbstractCtor<T> = {
    prototype: T;
};
export type Undefinable<T> = T | undefined;
export type Nullable<T> = T | null;
export type Settable<T> = Undefinable<T>;
export type UndefinableArray<T> = Undefinable<T>[];
export type Appendable<T> = UndefinableArray<T | UndefinableArray<T>>;
export type Fn<T, R> = (arg: T) => R;
export type BlockBuilderReturnableFn<T> = Fn<T, Appendable<BlockBuilder>>;
export type StringReturnableFn<T> = Fn<T, string>;
export type InitialUserEmail = {
    type: 'email';
    email: string;
};
export type InitialUserId = {
    type: 'id';
    id: string;
};
export type InitialUserUsername = {
    type: 'username';
    username: string;
};
export type InitialUserParams = InitialUserEmail | InitialUserId | InitialUserUsername;
export type DirectoryNameParams = {
    type: 'name';
    name: DirectoryName;
    [Prop.HintField]?: number;
    /** Включить в ответ подразделы с key  */
    includeKeys?: number[];
    /** Не включать в ответ подразделы с key  */
    removeKeys?: number[];
};
export type DirectoryApiParams = {
    type: 'api';
    id: number;
    parentKey?: number;
    /** Включить в ответ подразделы с key  */
    includeKeys?: number[];
    /** Не включать в ответ подразделы с key  */
    removeKeys?: number[];
    onlyEntries?: boolean;
    /** Взять parentKey из другого блока */
    parentKeyBlockId?: string;
    [Prop.HintField]?: number;
};
export type DirectoryParams = DirectoryNameParams | DirectoryApiParams;
export type OffsetParams = {
    /** Оффсет относительно сегодня */
    offset: number;
    /** Учитывать только рабочие дни */
    business?: boolean;
};
export type DatePickerPickerParams = {
    type: 'date';
    /** DD.MM.YYYY */
    start?: string;
    /** DD.MM.YYYY */
    end?: string;
    multi?: boolean;
} | {
    type: 'year';
    /** Показать как {год} - {год + 1} */
    double?: boolean;
    /** YYYY */
    start?: string;
    /** YYYY */
    end?: string;
    /** Флаг, что можно выбирать год в будущем */
    allowFuture?: boolean;
    multi?: boolean;
} | {
    type: 'month';
    /** Показать как {месяц} - {след. месяц} */
    double?: boolean;
    /** '0'-'11' */
    start?: string;
    /** '0'-'11' */
    end?: string;
    multi?: boolean;
};
export type AnalyticsParams = {
    /** ID аналитики */
    analyticId: number;
    /** ID поля аналитики */
    fieldId: number;
    /** ID лейбла аналитики */
    labelId?: number;
    /** Значения по значениям другого блока */
    refs?: {
        blockId: string;
        value: string;
        field?: number;
    }[];
};
export type OnChangeNavigate = {
    type: 'url';
    url: string;
} | {
    type: 'modal';
    name: string;
};
export type OnChangeModal = {
    /** Заголовок */
    title?: string;
    /** markdown */
    text?: string;
    okText?: string;
    closeText?: string;
    /** Отправка при сабмите */
    submit: boolean;
    /** Отправка на произвольный эндпоинт */
    external?: {
        data?: any;
        url: string;
    };
};
export type OnChangeSubmitParams = {
    type: 'submit';
    submit: boolean;
    navigate?: OnChangeNavigate;
    clearHistory?: boolean;
    metadata?: IPluginModalMeta;
};
export type OnChangeModalParams = {
    type: 'modal';
    navigate?: OnChangeNavigate;
    clearHistory?: boolean;
    url?: string;
    metadata?: IPluginModalMeta;
    modal: OnChangeModal;
};
export type OnChangeParams = OnChangeSubmitParams | OnChangeModalParams;
export type OnSelectParams = OnChangeParams;
export type TImageSelectVariant = 'select' | 'popover';
export type TRegExpParams = {
    regExp: RegExp;
    message?: string;
};
export type OffsetRangeParams = {
    /** Оффсет относительно сегодня */
    offsetMin: number;
    /** Оффсет относительно сегодня */
    offsetMax: number;
    /** Учитывать только рабочие дни */
    business?: boolean;
};
export type MultiBlockParams = {
    blocks: BlockBuilder[];
    /** Оффсет относительно сегодня */
    offsetMin: number;
    /** Оффсет относительно сегодня */
    offsetMax: number;
    /** Учитывать только рабочие дни */
    business?: boolean;
};
export type MaxDateRangeParams = {
    type: 'days' | 'months' | 'years' | 'ms';
    length: number;
};
