import { KeyFilterPattern } from 'primeng/keyfilter';
import { Observable } from 'rxjs';
import { ActionType, Align, ElementType, NumberMode, ValidationType } from './former.enum';
import { AutoCompleteElement } from './elements/autocomplete.model';
export interface FormDefinition {
    title?: string;
    elements: Elements;
    actions: Actions;
}
export type Element = TextElement | DisplayTextElement | TextAreaElement | NumberElement | GroupElement | CalendarElement | DropdownElement | InputGroupElement | AutoCompleteElement | CheckboxElement | CardElement | GridLayoutElement | GridColumnElement | TemplateElement;
export type Elements = Record<string, Element>;
export type LayoutElements = Record<string, GridColumnElement>;
export type FloatLabelType = 'in' | 'over' | 'on';
export interface BaseElement {
    title?: string;
    cssClass?: string;
    validators?: FormValidator[];
    wrapperClass?: string;
    floatLabel?: FloatLabelType;
    styleClass?: string;
}
export interface DisableElement {
    disabled?: boolean;
}
export interface UnitElement {
    icon?: string;
    unit?: string;
    keyFilter?: RegExp | KeyFilterPattern | null | undefined;
}
export interface TextElement extends BaseElement, DisableElement {
    type: ElementType.TextElement;
}
export interface DisplayTextElement extends BaseElement, DisableElement {
    type: ElementType.DisplayTextElement;
    labelClass?: string;
}
export interface TextAreaElement extends BaseElement, DisableElement {
    type: ElementType.TextAreaElement;
    rows: number;
    cols?: number;
}
export interface NumberElement extends BaseElement, DisableElement {
    type: ElementType.NumberElement;
    mode?: NumberMode;
    currency?: string;
    locale?: string;
    minFractionDigits?: number;
    maxFractionDigits?: number;
}
export interface InputGroupElement extends BaseElement, DisableElement, UnitElement {
    type: ElementType.InputGroupElement;
}
export interface GroupElement extends BaseElement, DisableElement {
    type: ElementType.GroupElement;
    elements: Elements;
}
export interface CalendarElement extends BaseElement, DisableElement {
    type: ElementType.CalendarElement;
    dateFormat: string;
}
export interface DropdownElement extends BaseElement, DisableElement {
    type: ElementType.DropdownElement;
    options: Observable<any>;
    optionLabel?: string;
    optionValue?: string;
}
export interface CheckboxElement extends BaseElement, DisableElement {
    type: ElementType.CheckboxElement;
    value: string;
}
export interface CardElement extends BaseElement {
    type: ElementType.CardElement;
    elements: Elements;
}
export interface TemplateElement extends BaseElement {
    type: ElementType.TemplateElement;
    templateId: string;
}
export interface LayoutElement {
    class: string;
}
export interface GridLayoutElement extends LayoutElement {
    type: ElementType.GridLayoutElement;
    elements: LayoutElements;
}
export interface GridColumnElement extends LayoutElement {
    type: ElementType.GridColumnElement;
    elements: Elements;
}
export interface AlignableButton {
    align?: Align;
}
export interface FormButton extends AlignableButton, DisableElement {
    type: ActionType.Button;
    label: string;
}
export interface SubmitButton extends AlignableButton, DisableElement {
    type: ActionType.Submit;
    label: string;
}
export interface CancelButton extends AlignableButton, DisableElement {
    type: ActionType.CancelButton;
    label: string;
}
export type ActionButton = FormButton | SubmitButton | CancelButton;
export type Actions = Record<string, ActionButton>;
export interface ActionResult {
    action: ActionButton;
    payload: any;
}
export type FormValidator = RequiredFormValidator | MinLengthFormValidator | MaxLengthFormValidator | MinFormValidator | MaxFormValidator | PatternFormValidator | EmailFormValidator;
export interface BaseFormValidator {
    validationType: ValidationType;
    messageKey: string;
    messageArgs?: any;
}
export type RequiredFormValidator = BaseFormValidator;
export interface MinLengthFormValidator extends BaseFormValidator {
    minLength: number;
}
export interface MaxLengthFormValidator extends BaseFormValidator {
    maxLength: number;
}
export interface MinFormValidator extends BaseFormValidator {
    min: number;
}
export interface MaxFormValidator extends BaseFormValidator {
    max: number;
}
export interface PatternFormValidator extends BaseFormValidator {
    pattern: RegExp | string;
}
export type EmailFormValidator = BaseFormValidator;
