import { DateRange } from '@seniorsistemas/angular-components/datepicker';
import { CalendarLocaleOptions } from '@seniorsistemas/angular-components/locale';
import { FieldConfig } from './field';
/**
 * Configuração para campos de data e hora.
 *
 * Quatro variantes disponíveis:
 * - `'date'` — apenas data (dia/mês/ano)
 * - `'time'` — apenas hora (hora:minuto[:segundo])
 * - `'dateTime'` — data com horário com timezone (UTC)
 * - `'localDateTime'` — data com horário sem timezone (local da máquina)
 *
 * Suporta restrições de intervalo, modo de visualização (dia/mês/ano), seleção múltipla
 * e localização de labels do calendário.
 */
export interface CalendarFieldConfig extends FieldConfig {
    /**
     * `'date'` — campo de data apenas.
     * `'time'` — campo de hora apenas.
     * `'dateTime'` — data e hora com timezone UTC.
     * `'localDateTime'` — data e hora sem timezone (local).
     */
    type: 'dateTime' | 'localDateTime' | 'time' | 'date';
    /**
     * Modo de visualização/seleção do calendário.
     * `'date'` — seletor de data (padrão).
     * `'month'` — seletor de mês/ano.
     * `'year'` — seletor de ano.
     */
    view?: 'date' | 'month' | 'year';
    /**
     * Data mínima selecionável. Datas anteriores serão desabilitadas no calendário.
     */
    minDate?: Date;
    /**
     * Data máxima selecionável. Datas posteriores serão desabilitadas no calendário.
     */
    maxDate?: Date;
    /**
     * Data exibida inicialmente ao abrir o calendário quando nenhuma data está selecionada.
     */
    defaultDate?: Date;
    /**
     * @deprecated O componente s-datepicker usa CDK Overlay nativamente para posicionamento.
     * Esta propriedade não tem efeito e será removida em versão futura.
     */
    appendTo?: string;
    /**
     * @deprecated O s-datepicker gerencia locale internamente via ngx-translate.
     * Use `dateFormat` e `hourFormat` diretamente.
     * As demais propriedades (dayNames, monthNames, firstDayOfWeek, etc.) são ignoradas.
     */
    calendarLocaleOptions?: CalendarLocaleOptions;
    /**
     * Formato de exibição da data no campo (ex: `'dd/MM/yyyy'`).
     * Substitui `calendarLocaleOptions.dateFormat`.
     */
    dateFormat?: string;
    /**
     * Formato de exibição das horas: `'12'` ou `'24'`.
     * Substitui `calendarLocaleOptions.hourFormat`.
     */
    hourFormat?: '12' | '24';
    /** Callback chamado quando o campo perde o foco. */
    onBlur?: (event: Event) => void;
    /** Callback chamado quando o campo recebe foco. */
    onFocus?: (event: Event) => void;
    /** Callback chamado quando o usuário seleciona uma data, mês, horário, intervalo ou múltiplas datas. */
    onSelect?: (event: Date | DateRange | Date[] | null) => void;
    /** Callback chamado quando o usuário digita manualmente no campo. */
    onInput?: (event: Event) => void;
    /** Callback chamado quando o painel do calendário é fechado. Recebe o elemento do painel. */
    onClose?: (event: HTMLElement) => void;
    /** Callback chamado quando o painel do calendário é aberto. */
    onShow?: () => void;
    /** Callback chamado quando o usuário clica no botão "Hoje". Recebe a data de hoje. */
    onTodayClick?: (event: Date) => void;
    /** Callback chamado quando o usuário clica no botão/ícone "Limpar". Recebe o evento de clique. */
    onClearClick?: (event: MouseEvent) => void;
    /** Callback chamado quando o mês visualizado muda. */
    onMonthChange?: (event: {
        month: number;
        year: number;
    }) => void;
    /** Callback chamado quando o ano visualizado muda. */
    onYearChange?: (event: {
        month: number;
        year: number;
    }) => void;
    /**
     * Modo de seleção de datas (aplica-se quando `type = 'date'`).
     * `'single'` — seleção de uma data (padrão).
     * `'multiple'` — seleção de múltiplas datas avulsas (valor é `Date[]`).
     */
    selectionMode?: 'single' | 'multiple';
    /**
     * Separador exibido entre as datas quando `selectionMode = 'multiple'`.
     * @default ', '
     */
    multipleSeparator?: string;
    /**
     * Separador exibido entre as datas de início e fim quando `selectionMode = 'range'`.
     * @default ' - '
     */
    rangeSeparator?: string;
    /**
     * Quando `true`, exibe o seletor de segundos no modo de hora.
     */
    showSeconds?: boolean;
    /**
     * Incremento em minutos ao usar as setas do time picker.
     * @default 5
     */
    minuteStep?: number;
    /**
     * Incremento em horas ao usar as setas do time picker.
     * @default 1
     */
    stepHour?: number;
    /**
     * Incremento em segundos ao usar as setas do time picker.
     * @default 1
     */
    stepSecond?: number;
    /**
     * Quando `true` (padrão), o painel abre ao focar o campo de input.
     * O foco permanece no input — não pula para o dropdown.
     * @default true
     */
    showOnFocus?: boolean;
    /**
     * Impede digitação manual no campo; valor só pode ser selecionado pelo calendário.
     * @default false
     */
    readonlyInput?: boolean;
    /**
     * Primeiro dia da semana (0 = domingo, 1 = segunda-feira, ..., 6 = sábado).
     * @default 0
     */
    firstDayOfWeek?: number;
    /**
     * Exibe/oculta a barra de botões Hoje e Limpar no rodapé do calendário.
     * @default true
     */
    showButtonBar?: boolean;
    /**
     * Exibe ícone de limpar inline no campo de input (além do botão no rodapé).
     * @default false
     */
    showClear?: boolean;
    /**
     * Exibe dias de meses adjacentes na grade do calendário.
     * @default true
     */
    showOtherMonths?: boolean;
    /**
     * Permite selecionar dias de meses adjacentes na grade do calendário.
     * @default false
     */
    selectOtherMonths?: boolean;
    /**
     * Fecha o painel após selecionar uma data no modo `dateTime`.
     * Por padrão o painel permanece aberto para seleção da hora.
     * @default false
     */
    hideOnDateTimeSelect?: boolean;
    /**
     * Datas específicas que devem ser desabilitadas no calendário.
     */
    disabledDates?: Date[];
    /**
     * Dias da semana desabilitados (0 = domingo, 1 = segunda, ..., 6 = sábado).
     * Exemplo: `[0, 6]` desabilita finais de semana.
     */
    disabledDays?: number[];
    /**
     * Índice de tab do campo de input.
     */
    tabindex?: number;
    /**
     * Foca automaticamente o campo ao carregar o componente.
     * @default false
     */
    autofocus?: boolean;
}
declare module './field' {
    interface FieldTypeMap {
        dateTime: CalendarFieldConfig;
        localDateTime: CalendarFieldConfig;
        time: CalendarFieldConfig;
        date: CalendarFieldConfig;
    }
}
