import { AutocompleteProps } from '@mui/material';
import { CheckboxProps } from '@mui/material';
import { Control } from 'react-hook-form';
import { DateFieldProps } from '@mui/x-date-pickers';
import { DatePickerProps } from '@mui/x-date-pickers';
import { DateTimeFieldProps } from '@mui/x-date-pickers';
import { DateTimePickerProps } from '@mui/x-date-pickers';
import { FieldValues } from 'react-hook-form';
import { FormLabel } from '@mui/material';
import { Path } from 'react-hook-form';
import { RadioGroupProps } from '@mui/material';
import { ReactElement } from 'react';
import { ReactMaskOpts } from 'react-imask';
import { ReactNode } from 'react';
import { SelectProps } from '@mui/material';
import { SliderProps } from '@mui/material';
import { SwitchProps } from '@mui/material';
import { TextFieldProps } from '@mui/material';

declare interface Category {
    label: string;
    value: string;
}

declare interface OptionItem extends SelectOptionBase {
    value: string;
}

declare interface OptionItem_2 {
    label: string;
    value: string;
    disabled?: boolean;
}

declare interface OptionItem_3 extends SelectOptionBase {
    value: string;
    category?: Category;
}

declare type Props<T extends FieldValues, Value extends OptionItem, Multiple extends boolean, DisableClearable extends boolean, FreeSolo extends boolean> = Omit<AutocompleteProps<Value, Multiple, DisableClearable, FreeSolo>, "name" | "renderInput" | "multiple"> & {
    readonly name: Path<T>;
    readonly label: ReactNode;
    readonly options: OptionItem[];
    readonly control?: Control<T>;
    readonly inputDir?: "ltr" | "rtl";
    readonly renderInputProps?: Omit<TextFieldProps, "name">;
    readonly multiple?: boolean;
    readonly hasEmptyHelper?: boolean;
    readonly helperText?: ReactNode;
};

declare type Props_10<T extends FieldValues> = Omit<TextFieldProps, "name"> & {
    readonly name: Path<T>;
    readonly maskOptions: ReactMaskOpts;
    readonly control?: Control<T>;
    readonly inputDir?: "ltr" | "rtl";
    readonly isReadOnly?: boolean;
    readonly hasEmptyHelper?: boolean;
};

declare interface Props_11<T extends FieldValues> {
    readonly name: Path<T>;
    readonly maskOptions: ReactMaskOpts;
    readonly control?: Control<T>;
    readonly label: ReactNode;
}

declare type Props_12<T extends FieldValues> = Omit<DateFieldProps, "name"> & {
    readonly name: Path<T>;
    readonly control?: Control<T>;
    readonly isReadOnly?: boolean;
    readonly hasEmptyHelper?: boolean;
};

declare type Props_13<T extends FieldValues> = Omit<DateTimeFieldProps, "name"> & {
    readonly name: Path<T>;
    readonly control?: Control<T>;
    readonly isReadOnly?: boolean;
    readonly hasEmptyHelper?: boolean;
};

declare type Props_2<T extends FieldValues> = Omit<CheckboxProps, "name"> & {
    readonly name: Path<T>;
    readonly label: ReactNode;
    readonly control?: Control<T>;
    readonly helperText?: ReactNode;
    readonly hasEmptyHelper?: boolean;
};

declare type Props_3<T extends FieldValues> = Omit<DatePickerProps, "name"> & {
    readonly name: Path<T>;
    readonly control?: Control<T>;
    readonly isReadOnly?: boolean;
    readonly hasEmptyHelper?: boolean;
};

declare type Props_4<T extends FieldValues> = Omit<DateTimePickerProps, "name"> & {
    readonly name: Path<T>;
    readonly control?: Control<T>;
    readonly isReadOnly?: boolean;
    readonly hasEmptyHelper?: boolean;
};

declare type Props_5<T extends FieldValues> = Omit<RadioGroupProps, "name"> & {
    readonly name: Path<T>;
    readonly options: OptionItem_2[];
    readonly formLabel?: ReactElement<typeof FormLabel>;
    readonly control?: Control<T>;
    readonly helperText?: ReactNode;
    readonly hasEmptyHelper?: boolean;
    readonly disabled?: boolean;
};

declare type Props_6<T extends FieldValues> = Omit<SelectProps, "name"> & {
    readonly name: Path<T>;
    readonly options: OptionItem_3[];
    readonly control?: Control<T>;
    readonly inputDir?: "ltr" | "rtl";
    readonly maxHeight?: number;
    readonly dropDownMaxHeight?: number;
    readonly categorized?: boolean;
    readonly uncategorizedText?: string;
    readonly helperText?: ReactNode;
    readonly hasEmptyHelper?: boolean;
};

declare type Props_7<T extends FieldValues> = Omit<SliderProps, "name"> & {
    readonly name: Path<T>;
    readonly label?: ReactNode;
    readonly control?: Control<T>;
    readonly helperText?: ReactNode;
    readonly hasEmptyHelper?: boolean;
    readonly sliderDir?: "ltr" | "rtl";
    readonly disabled?: boolean;
};

declare type Props_8<T extends FieldValues> = Omit<SwitchProps, "name"> & {
    readonly name: Path<T>;
    readonly label: ReactNode;
    readonly control?: Control<T>;
    readonly helperText?: ReactNode;
    readonly hasEmptyHelper?: boolean;
};

declare type Props_9<T extends FieldValues> = Omit<TextFieldProps, "name"> & {
    readonly name: Path<T>;
    readonly control?: Control<T>;
    readonly inputDir?: "ltr" | "rtl";
    readonly isReadOnly?: boolean;
    readonly hasEmptyHelper?: boolean;
};

export declare function RHFAutoComplete<T extends FieldValues, Value extends OptionItem = OptionItem, Multiple extends boolean = false, DisableClearable extends boolean = false, FreeSolo extends boolean = false>({ name, label, options, control, inputDir, renderInputProps, multiple, helperText, hasEmptyHelper, disabled, ...props }: Props<T, Value, Multiple, DisableClearable, FreeSolo>): ReactElement;

export declare function RHFCheckBox<T extends FieldValues>({ name, label, control, helperText, hasEmptyHelper, disabled, ...props }: Props_2<T>): ReactElement;

export declare function RHFDateFieldJalali<T extends FieldValues>({ name, control, isReadOnly, hasEmptyHelper, disabled, ...props }: Props_12<T>): ReactElement;

export declare function RHFDatePickerJalali<T extends FieldValues>({ name, control, isReadOnly, hasEmptyHelper, disabled, ...props }: Props_3<T>): ReactElement;

export declare function RHFDateTimeFieldJalali<T extends FieldValues>({ name, control, isReadOnly, hasEmptyHelper, disabled, ...props }: Props_13<T>): ReactElement;

export declare function RHFDateTimePickerJalali<T extends FieldValues>({ name, control, isReadOnly, hasEmptyHelper, disabled, ...props }: Props_4<T>): ReactElement;

export declare function RHFPasswordField<T extends FieldValues>({ name, control, label, maskOptions }: Props_11<T>): ReactElement;

export declare function RHFRadioGroup<T extends FieldValues>({ name, options, formLabel, control, helperText, hasEmptyHelper, disabled, ...props }: Props_5<T>): ReactElement;

export declare function RHFSelect<T extends FieldValues>({ name, options, control, inputDir, maxHeight, dropDownMaxHeight, categorized, uncategorizedText, helperText, hasEmptyHelper, disabled, ...props }: Props_6<T>): ReactElement;

export declare function RHFSlider<T extends FieldValues>({ name, label, control, helperText, hasEmptyHelper, sliderDir, disabled, ...props }: Props_7<T>): ReactElement;

export declare function RHFSwitch<T extends FieldValues>({ name, label, control, helperText, hasEmptyHelper, disabled, ...props }: Props_8<T>): ReactElement;

export declare function RHFTextField<T extends FieldValues>({ name, control, inputDir, isReadOnly, hasEmptyHelper, disabled, ...props }: Props_9<T>): ReactElement;

export declare function RHFTextMasked<T extends FieldValues>({ name, control, maskOptions, inputDir, isReadOnly, disabled, hasEmptyHelper, ...props }: Props_10<T>): ReactElement;

declare interface SelectOptionBase {
    label: string;
    value: unknown;
    disabled?: boolean;
}

export { }
