import { EventEmitter } from "../../stencil-public-runtime";
export interface CalendarDay {
  day?: number;
  disabled?: boolean;
  selected?: boolean;
  range?: boolean;
  initRange?: boolean;
  endRange?: boolean;
  over?: boolean;
}
export interface CalendarMonth {
  month?: number;
  monthName?: string;
  year?: number;
  weeks?: Array<Array<CalendarDay>>;
  days?: number;
}
export interface CalendarEvent {
  date?: Date;
  parsedDate?: string;
}
export declare class IbkCalendar {
  /** Referencia del web component */
  host: HTMLElement;
  /** Texto de ayuda encima del calendario */
  label: string;
  /** Se incluye el subtitulo entre el label (si existiera) y el calendario */
  subtitle: string;
  /** Define un placeholder en el selector */
  placeholder: string;
  /** Define la cantidad de meses a mostrar en el selector */
  months: number;
  /** Si la candidad de meses a mostrar es 2, define si se muestra el mes siguiente o anterior */
  showMonth: 'next' | 'prev';
  /** Define hacia que lado se abrirá el calendario */
  openTo: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';
  /** Define la fecha inicial en formato DD/MM/YYYY */
  initialDate: string;
  /** Define la fecha final en formato DD/MM/YYYY */
  endDate: string;
  /** Define la fecha seleccionada cuando se muestra 1 mes en formato DD/MM/YYYY */
  selectedDate: string;
  /** Define las fechas seleccionadas cuando se muestran 2 meses en formato DD/MM/YYYY y separados por una coma */
  selectedDates: string;
  /** Define si se podrá seleccionar un rango de fechas */
  multiselect: boolean;
  /** El selector del calendario ocupará el 100% del espacio disponible */
  full: boolean;
  /** Se mostrará una barra de botones para seleccionar rápidamente entre día, última semana o último mes */
  rangeSelector: 'day' | 'week' | 'month' | 'none';
  /** Se mostrará un mensaje de error */
  error: boolean;
  /** Cuando se encuentra dentro de un "ibk-form" al hacer submit si el calendario se encuentra vacío, mostrará un mensaje de error */
  required: boolean;
  /** Personaliza el mensaje de campo requerido */
  requiredMessage: string;
  /** Define si el calendario no contará con manejo de errores. Se omitirá el espacio generado para el mensaje de error */
  noHandlingError: boolean;
  /** Emite un evento al seleccionar una fecha única o un rango.
   * Retorna un objeto único cuando el selector es de una sola fecha y retorna un Array de objetos cuando se selecciona un rango
  */
  onselect: EventEmitter<CalendarEvent | Array<CalendarEvent>>;
  /** Determina si se está mostrando o no el calendario */
  _showingDates: boolean;
  /** Contiene la posición en la pantalla del contenido del selector */
  _datesPosition: {};
  /** Fecha inicial a mostra en el calendario */
  _currentDate: Date;
  /** Define la fecha con el mes siguiente o anterior dependiendo del mes a mostrar */
  _otherDate: Date;
  /** Almacenará la fecha actual al momento de hacer over sobre el botón */
  _tempOverRange: Date;
  /** Almacena temporalmente el rango mientras se va seleccionando */
  private _tempRange;
  /** Almacena la configuración del usuario para la propiedad multiselect */
  private _settedMultiselect;
  componentDidLoad(): void;
  componentWillLoad(): void;
  /** Configurar algunas opciones en base a las propiedades usadas */
  config: () => void;
  /** Configura la clase del componente basado en estados y modificadores */
  containerClass(): string;
  /** Evento al cambiar el tamaño de la pantalla */
  resizeWindow: () => void;
  /** Cierra el dropdown al hacer click fuera del mismo */
  bodyClick: () => void;
  /** Define la fecha con el mes siguiente o anterior dependiendo del mes a mostrar */
  setOtherDate: () => void;
  /** Obtener la cantidad de dias que hay por mes */
  getDaysPerMonth: (month: number, year: number) => number;
  /** Obtener un arreglo por cada semana del mes que contiene los dias y sus estados */
  getWeeksPerMonth: (month: number, year: number) => Array<Array<CalendarDay>>;
  /** Retorna el nombre del mes basado en el índice */
  getMonthName: (month: number) => string;
  /** Obtiene la fecha en formato "DD/MM/YYYY" y lo convierte a formato Date */
  parseDate: (date: string) => Date;
  /** Arreglo que contiene los días del mes actual, además del mes anterior o posterior dependiendo del mes a mostrar */
  drawDates: () => Array<CalendarMonth>;
  /** Obtener la posición del selector para abrir las fechas en base a su posición */
  getDatesPosition: () => any;
  /** Muestra u oculta el calendario */
  toggleDates: () => void;
  /** Configura la clase del día basado en estados y modificadores */
  setContainerDayClass: (day: CalendarDay, monthDays?: number) => string;
  /** Configura el valor del selector */
  setSelectorValue: () => string;
  /** Recibe un formato Date y lo transforma a DD/MM/YYYY */
  parseDateToString: (date: Date) => string;
  /** Función al seleccionar una fecha única o rango */
  selectDate: (e: MouseEvent, year: number, month: number, day: number) => void;
  /** Cambia el calendario dependiendo de la flecha seleccionada */
  changeMonth: (to: 'next' | 'prev') => void;
  /** Selecciona un rango entre dìa, semana y mes */
  selectRange: (e: MouseEvent, choose: 'day' | 'week' | 'month' | 'none') => void;
  /** Hace efecto over sobre el botón del día y aplica un fondo cuando se esta seleccionando un rango de fechas */
  overDay: (year: number, month: number, day: number) => void;
  /** Detecta cuando el mouse deja de hacer over sobre el botón del día */
  leaveDay: (e: MouseEvent) => void;
  render(): any;
}
