/**
 * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import { CalendarWeekItem } from "../types/calendar";
import { DateObject, Period, MarkedDates, MarkStatus, DataRangePicked, FirstDayOfTheWeek } from "../types/common";
import { DateModel } from "../types/date-model";
import { ActiveMonth, MonthViewItem, NameOfMonths } from "../types/month";
import { YearViewItem } from "../types/year";
export interface DateFormatInfo {
    value: string;
    format: string;
}
export interface UseDateFormat {
    formatDate: (date: DateObject, dateFormat: string, monthLabels: NameOfMonths) => string;
    getDateValue: (dateStr: string, dateFormat: string, delimeters: string[] | null) => DateFormatInfo[];
    preZero: (val: number) => string;
    remove: (format: string, delStr: string) => string;
}
export interface UseDate {
    emptyDate: () => DateObject;
    getDate: (date: DateObject) => Date;
    getDate2: (date: DateObject) => Date;
    getDayNumber: (date: DateObject) => number;
    getWeekdayIndex: (wd: string) => number;
    getTimeInMilliseconds: (date: DateObject) => number;
    getEpocTime: (date: DateObject) => number;
    getNearDate: (now: DateObject, min: DateObject, max: DateObject) => DateObject;
    getToday(): DateObject;
    getDateObject(dateString: string, dateFormat: string): DateObject;
    getMinDate(value: Date | string | null | undefined): DateObject;
    getMaxDate(value: Date | string | null | undefined): DateObject;
    getTimeValue(timeValue: string, isDateRange?: boolean): {
        hour: number;
        minute: number;
        second: number;
    };
    getEndTimeValue(timeValue: string): {
        hour: number;
        minute: number;
        second: number;
    };
    convertDateToDateObject(date: Date): DateObject;
}
export interface UseNumber {
    getDayNumber: (date: DateObject) => number;
    getNumberByValue: (df: DateFormatInfo) => number;
    getMonthNumberByMonthName: (df: DateFormatInfo, monthLabels: NameOfMonths) => number;
    getWeekNumber: (date: DateObject) => number;
}
export interface UseNormalizeDate {
    normalizeDate: (dateString: string, useValueFormat: boolean) => DateObject;
    normalizeDateRange: (dateRangeString: string) => Period;
    setNewDateRange: (period: Period, newDate: DateObject) => DataRangePicked;
    getActiveMonth: (dateValue: string) => {
        dateRange: Period;
        beginDateActiveMonth?: any;
        endDateActiveMonth?: any;
        beginTime?: any;
        endTime?: any;
        selectedWeekInfo?: any;
    };
    getTimeStr: (date: Date) => string;
    getMonthAndYear: () => {
        startMonth: {
            month: number;
            year: number;
        };
        endMonth: {
            month: number;
            year: number;
        };
    };
}
export interface UseCompare {
    isDateEarlier: (firstDate: DateObject, secondDate: DateObject) => boolean;
    equal: (firstDate: DateObject, secondDate: DateObject) => boolean;
    inPeriod: (date: DateObject, period: Period | null) => boolean;
    isPoint: (period: Period, date: DateObject) => boolean;
    equalOrEarlier: (firstDate: DateObject, secondDate: DateObject) => boolean;
    isInitializedDate: (date: DateObject) => boolean;
    isInitializedMonth: (date: DateObject) => boolean;
    isInitializedYear: (date: DateObject) => boolean;
    isMonthDisabledByDisableSince: (date: DateObject, disableSince: DateObject) => boolean;
    isMonthDisabledByDisableUntil: (date: DateObject, disableUntil: DateObject) => boolean;
}
export interface UseMonth {
    parseDefaultMonth: (monthString: string) => ActiveMonth;
    daysInMonth: (month: number, year: number) => number;
    daysInPreMonth: (month: number, year: number) => number;
    generateMonths: (nameOfMonths: string[], selectedMonth: DateObject, disableSince: DateObject, disableUntil: DateObject) => MonthViewItem[][];
    getNextMonth: (month: number, year: number) => DateObject;
    getPreviousMonth: (month: number, year: number) => DateObject;
}
export interface UseMark {
    isMarkedDate: (date: DateObject, markedDates: MarkedDates[], markWeekends: MarkStatus) => MarkStatus;
    isHighlightedDate: (date: DateObject, sunHighlight: boolean, satHighlight: boolean, highlightDates: DateObject[]) => boolean;
}
export interface UseWeek {
    getNowWeekTime: (date: Date, firstDayOfWeek: FirstDayOfTheWeek) => Period;
}
export interface UseDisableTime {
    disabledHours: (min: DateObject, max: DateObject, currentDate: DateObject) => number[];
    disabledMinutes: (min: DateObject, max: DateObject, currentDate: DateObject) => number[];
    disabledSeconds: (min: DateObject, max: DateObject, _hour: number, _minute: number, currentDate: DateObject) => number[];
}
export interface UseDateModel {
    getDateModel: (date: DateObject, period: Period, dateFormat: string, nameOfMonths: NameOfMonths, rangeDelimiter: string, returnFormat: string, dateStr: string) => DateModel;
    getFormattedDate: (model: DateModel) => string | undefined;
}
export interface UseDisableDate {
    isDisabledDate: (date: DateObject) => boolean;
}
export interface UseEvent {
    getKeyCodeFromEvent: (event: KeyboardEvent) => number;
}
export interface UseDisableMonth {
    isMonthDisabledByDisableUntil: (date: DateObject, disableUntil: DateObject) => boolean;
    isMonthDisabledByDisableSince: (date: DateObject, disableSince: DateObject) => boolean;
}
export interface UseYear {
    generateYears: (input: number, selectedMonth: DateObject, min: number, max: number, disableSince: DateObject, disableUntil: DateObject) => YearViewItem[][];
}
export interface UseCalendar {
    generateCalendar: (month: number, year: number, firstDayOfWeek: string, markedDates: MarkedDates[], markWeekends: MarkStatus, highlightDates: DateObject[], highlightSaturday: boolean, highlightSunday: boolean, showWeekNumber: boolean) => CalendarWeekItem[];
}
