import { Maybe } from '@m4l/core';
import { Sizes } from '@m4l/styles';
import { Theme } from '@mui/material/styles';
import { M4LOverridesStyleRules } from '../../@types/augmentations';
import { DYNAMIC_SORT_KEY_COMPONENT } from './constants';
import { DynamicSortSlots } from './slots';
export type SortFieldType = 'string' | 'number' | 'date' | 'boolean';
export type OperandInitialSortType = string;
export type SortOperator = 'asc' | 'desc';
export type FieldPresence = 'initialized' | 'fixed' | 'optional';
export type FieldTypeOperator = SortOperator;
export interface FieldBase {
    name: string;
    type: SortFieldType;
    presence?: FieldPresence;
    urlIcon: string;
    defaultOperator?: Maybe<FieldTypeOperator>;
}
export interface FieldDictionaryId extends FieldBase {
    dictionaryId: string;
    label?: undefined;
}
export interface Label extends FieldBase {
    label: string;
    dictionaryId?: undefined;
}
export type SortField = FieldDictionaryId | Label;
export interface BaseApplySort {
    id: number;
    field: SortField;
    isSet: boolean;
    fixed: boolean;
}
/**
 * Base para el tipado de overloading de los valores de un sort
 */
/**
 * Valor de un filtro sobrecargado para cada tipo de dato
 */
export type SortValue = {
    fieldType: SortFieldType;
    operator: SortOperator;
};
/**
 * Estado del Filtro + Valor valor del filtro.
 */
export type SortFieldApplied = BaseApplySort & SortValue;
/**
 * RawSortFieldApply Formato para enviar los sorts a las APIs.
 */
export interface RawSortFieldApply {
    n: string;
    o: SortOperator;
    ft: SortFieldType;
}
export type SortToEditApply = SortFieldApplied;
export interface DataTypeFilerLabels {
    labelField: string;
    labelOperator: string;
}
/**
 * Tipado de los sorts a inicializar el componente DynamicSort
 */
export type InitialSortApplied = {
    name: string;
    operator: SortOperator;
};
export type FormOperator = {
    operator: SortOperator;
    name: string;
};
export type FormOperandString = {
    operator: string;
    name: string;
};
export type FormOperand = FormOperandString;
/**
 * Base para el tipado de overloading de los valor de un filtro
 */
export interface FormSortValueBase {
    fieldType: SortFieldType;
    formValueOperator: SortOperator;
}
/**
 * Valor de un filtro sobrecargado para cada tipo de dato
 */
export type FormSortValue = FormSortValueBase;
/**
 * Estado del Filtro + Valor valor del filtro.
 */
export type FormSortFieldApplied = BaseApplySort & FormSortValue;
/**
 * Tipado del handler cuando se ejecuta el filtro
 */
export type OnChangeSorts = (
/**
 *  "Sorts" Vector de sorts aplicados, los cuales pueden servir como entrada del campo "i"nitialappliedSorts" en un refresh,
 */
Sorts: Array<InitialSortApplied>, 
/**
 *  "rawSorts" Vector de sorts aplicados, en el formato que puede ser llevado a un endpoint.
 *   ver:  https://www.notion.so/made4labs/Filtrado-de-listas-55afdd8ac92e483abd34e5365b74ee29
 */
rawSorts: Array<RawSortFieldApply>) => void;
/**
 * Propiedades que recibe el componente DynamicSort
 */
export interface DynamicSortProps {
    /**
     *  "className" clase css para el componente
     */
    className?: string;
    /**
     *  "storeId" identificador del store
     */
    storeId?: string;
    /**
     *  "storeDevtoolsEnabled" determina si se debe usar devtools para el store
     */
    storeDevtoolsEnabled?: boolean;
    /**
     *  Define si el filtro se ejecuta automáticamente cuando se agrega o se modifica un filtro.
     *  @default true
     */
    automatic?: boolean;
    /**
     * Array con la configuración de cada campo por el que se podrá filtrar.
     */
    fields: Array<SortField>;
    /**
     *  Array con la configuración de cada campo por el que se podrá hacer  Sort.
     */
    initialAppliedSorts?: Array<InitialSortApplied>;
    /**
     * Handler que se dispara cuando el filtro cambia en automatico, o cuando es manual y se presion el boton de filtrar
     */
    onChangeSorts?: OnChangeSorts;
    /**
     * Handler cuando se marca como dirty
     */
    onDirty?: () => void;
    /**
     * Key único para necesario para las pruebas del componente.
     */
    dataTestId?: string;
    /**
     * Propiedad para las variantes de tamaño
     */
    size?: Extract<Sizes, 'small' | 'medium'>;
    /**
     *  visibleRefresh: indica si el boton de refresh debe estar visible
     */
    visibleRefresh?: boolean;
}
/**
 * Interface que define la variables que se van a usar en clases del componente
 */
export interface OwnerState extends Pick<DynamicSortProps, 'automatic'> {
    /**
     *  "inEdition" se establece cuando se está en edición.
     */
    inEdition: boolean;
    /**
     *  "isDirty" cuando el componente tiene sorts por aplicar
     */
    isDirty: boolean;
    /**
     *  "isValid" cuando el comnponente está en un estado invalido
     */
    isValid: boolean;
    /**
     *  "isEmpty" Define si existen sorts aplicados
     */
    isEmpty: boolean;
    /**
     * Propiedad para las variantes de tamaño
     */
    size?: Extract<Sizes, 'small' | 'medium'>;
}
export interface DynamicSortOwnerState extends DynamicSortProps, OwnerState {
}
export type DynamicSortSlotsType = keyof typeof DynamicSortSlots;
export type DynamicSortStyles = M4LOverridesStyleRules<DynamicSortSlotsType, typeof DYNAMIC_SORT_KEY_COMPONENT, Theme>;
export interface DynamicSortRef {
    fireOnChangeSort: () => void;
    addExternalSort: (newSort: SortFieldApplied) => void;
    removeExternalSort: (columnKey: string) => void;
    getNewId: () => number;
    getCurrentSorts: () => SortFieldApplied[];
}
//# sourceMappingURL=types.d.ts.map