/**
 * 创建或转换日期选择框
 * @param min 最小可选日期
 * @param max 最大可选日期
 * @param element 转换该元素为日期选择框
 * @returns 返回创建或转换的日期选择框
 */
export function createDateInput(min?: string, max?: string, element?: HTMLInputElement): HTMLInputElement;

/**
 * 将日期转换成 yyyy-MM-dd 格式的字符串
 * @param dt 日期值
 * @param local 是否视日期为本地时间
 */
export function toDateValue(dt: Date, local?: boolean): string;

/**
 * 格式化日期字符串
 * @param date 要格式化的日期值<br/><br/>
 * 支持以下几种数据类型<br/><br/>
 * `"2024-01-26"`<br/>
 * `"1/26/2024"`<br/>
 * `"638418240000000000"`<br/>
 * `new Date('2024-01-26')`<br/>
 * @returns 格式化为 M/d/yyyy 的日期字符串
 */
export function formatDate(date: Date | number | string, formatter?: string): string;

/**
 * 设置显示日期
 * @param element 要设置显示日期的元素
 * @param val 日期值，支持格式参见 {@linkcode formatDate}
 * @param formatter 日期格式化字符串（仅设置显示元素时调用）
 */
export function setDateValue(element: HTMLElement, val: Date | number | string, formatter?: string): void;

/**
 * 从日期选择框获取日期值
 * @param element 要获取的日期选择框
 * @param formatter 自定义格式化函数，传入参数为 `Date` 类型
 * @returns 默认返回日期 `ticks` 的字符串
 */
export function getDateValue(element: HTMLInputElement, formatter?: string | ((date: Date) => string)): string;

/** 日期选择框类 */
export class DateSelector {
    /**
     * 把父容器下所有匹配 `input[data-type="date"]` 的元素修改为统一的日期选择框<br/><br/>
     * 解析的属性为 `id`, `class`, `data-min`, `data-max`, `disabled`
     * @param dom 父元素
     * @param trigger 日期设置事件触发函数（上下文为触发设置日期的 `DateSelector` 实例）
     * @example
     * HTML:
     *  ```html
     *  <input id="dateFrom" data-type="date" data-min="1980-01-01"/>
     *  ```
     * js:
     *  ```js
     *  const libUI = window['lib-ui'];
     *  const DateSelector = libUI.DateSelector;
     *  const formatDate = libUI.formatDate;
     *  
     *  
     *  // 解析 document.body 下所有符合条件的元素，转换为日期选择框，第二个参数可选
     *  DateSelector.resolve(document.body, function (date) {
     *      console.log(`element(#${this.element.id}), date changed to: ${formatDate(date)}`);
     *      // 当日期选择改变时，控制台将会输出：element(#dateFrom), date changed to: 1/30/2024
     *  });
     *  
     *  
     *  // 在其他地方调用时
     *  const value = document.querySelector('#dateFrom').value;
     *  console.log(`dateFrom.value = '${value}', formatted: '${formatDate(value)}'`);
     *  // 控制台会输出：dateFrom.value = '2024-01-30', formatted: '1/30/2024'
     *  ```
     */
    static resolve(dom?: HTMLElement, trigger?: (this: DateSelector, date: Date) => void): HTMLElement;

    /**
     * 日期选择框构造函数
     * @param opts 日期选项参数
     */
    constructor(opts: {
        /** 最小可选择日期 */
        minDate?: string,
        /** 最大可选择日期 */
        maxDate?: string,
        /** 是否启用 */
        enabled?: boolean,
        /** 焦点索引 */
        tabIndex?: number,
        /** 类名 */
        className?: string,
        /**
         * 自定义格式化函数，用于获取日期值时调用
         * @param date 日期值
         * @returns 返回格式化的值
         */
        valueFormatter?: (date: Date) => any
    });

    /**
     * 创建或转换日期选择框元素
     * @param element 转换该元素为日期选择框
     * @returns 返回创建或转换的日期选择元素
     */
    create(element?: HTMLInputElement): HTMLInputElement;

    /** 获取日期选择框元素 */
    get element(): HTMLInputElement;

    /** 获取日期选择框是否启用 */
    get enabled(): boolean;
    /** 设置日期选择框启用状态 */
    set enabled(flag: boolean);

    /** 获取设置的日期值，或经过格式化函数返回的值 */
    get value(): Date | any;
    /** 设置日期值，支持的格式参见 {@linkcode formatDate} */
    set value(val: Date | number | string);

    /** 获取最小可选择日期 */
    get minDate(): string;
    /** 设置最小可选择日期 */
    set minDate(date: string);

    /** 获取最大可选择日期 */
    get maxDate(): string;
    /** 设置最大可选择日期 */
    set maxDate(date: string);

    /**
     * 日期发生变化时触发的事件
     * @param date 日期值，或者经自定义参数中格式化函数格式后的值
     * @eventProperty
     */
    onDateChanged?: (this: DateSelector, date: Date | any) => void;
}