import type { Dayjs } from 'dayjs'
import type { BasicWidgetInstance, BasicWidgetProps } from '../../utils'

/**
 * 对应 first-ui datePicker 组件 type 参数
 */
type FirstUIDatePickerType = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8

export interface TimeBarChangeEvent {
    value: Dayjs[]
    option?: TimeBarLabel['options'][0]
}

export interface TimeBarLabel {
    text?: string
    breforeIcon?: boolean
    afterIcon?: boolean
    options?: {
        text?: string
        value?: string
        checked?: boolean
        format?: string
        timeType?: FirstUIDatePickerType
    }[]
    onClick?: () => void
    onChange?: (e: TimeBarChangeEvent) => void
}

export interface TimeBarTime {
    type?: 'single' | 'range'
    timeType?: FirstUIDatePickerType
    format?: string
    value?: Dayjs[]
    onChange?: (e: TimeBarChangeEvent) => void
    hourRange?: Array<number | string> | string
    minuteRange?: Array<number | string> | string
}

export interface TimeBarButton {
    /**
     * 图标，仅支持 fui-icon name
     */
    icon?: string
    label: string
    onClick?: (e: { index: number; label: string }, time: TimeBarChangeEvent) => void
}

export interface TimeBarProps extends BasicWidgetProps {
    /**
     * 是否只读
     * @default false
     */
    readonly?: boolean
    /**
     * 对齐方式
     * @default left
     */
    align?: 'left' | 'center' | 'right'
    /**
     * 标题
     * @default { text: '时间' }
     */
    label?: TimeBarLabel
    /**
     * 时间
     */
    time?: TimeBarTime
    /**
     * 最小时间
     */
    minTime?: Dayjs
    /**
     * 最大时间
     */
    maxTime?: Dayjs
    /**
     * 扩展按钮
     */
    buttons?: TimeBarButton[]
}

export interface TimeBarInstance extends BasicWidgetInstance<TimeBarProps> {
    /**
     * 获取时间
     * @returns 时间
     */
    getTime: () => Dayjs[]
    /**
     * 设置时间
     * @param time 时间
     */
    setTime: (time: Dayjs[], mode?: boolean) => void
    /**
     * 获取选中的选项
     * @returns 选中的选项
     */
    getCheckedOption: () => TimeBarLabel['options'][0]
    /**
     * 设置选中的选项
     * @param index 选项索引
     */
    setCheckedOption: (index: number) => void
    /**
     * 获取时间栏的值
     * @returns 时间栏的值
     */
    getTimeBarValue: () => TimeBarChangeEvent

    /**
     * 设置小时可选范围
     * @param hourRange
     * @returns
     */
    setHourRange: (hourRange: Array<number | string> | string) => void
    /**
     * 设置分钟可选范围
     * @param minuteRange
     * @returns
     */
    setMinuteRange: (minuteRange: Array<number | string> | string) => void
}
