import PickerWrapper, { pickerSlots } from "./PickerWrapper.jsx"
import { ref, defineComponent, computed, watch } from "vue"
import { Calendar, Collapse, CollapseItem, TimePicker } from "vant"
import MpButton from "../button/MpButton.jsx"
import { padZero } from "vant/es/utils"
import { defaultFieldProps } from "../utils"

/**
 * MpDatetime 日期时间选择器
 * @version 1.0.0
 */
export default defineComponent({
	name: "MpDatetime",
	props: {
		...defaultFieldProps,

		modelValue: { type: Date, default: () => null },
	},
	emits: ["update:modelValue"],
	setup(props, { slots, emit, expose }) {
		const dateValue = ref(null)
		const timeValue = ref(null)

		/**
		 *
		 * @param {Date|null} date
		 */
		const prepareDate = (date) => {
			if (date) {
				dateValue.value = date
				timeValue.value = `${padZero(date.getHours(), 2)}:${padZero(date.getMinutes(), 2)}`
			}
		}

		prepareDate(props.modelValue)

		watch(
			() => props.modelValue,
			() => prepareDate(props.modelValue),
		)

		const pickerRef = ref()

		const activeName = ref("date")

		const minDate = new Date(2010, 0, 1)
		const maxDate = new Date(2045, 11, 31)

		const weekdays = ["日", "一", "二", "三", "四", "五", "六"]

		const dateText = computed(() => {
			if (dateValue.value) {
				return `${dateValue.value.getFullYear()}/${dateValue.value.getMonth() + 1}/${dateValue.value.getDate()} 星期${
					weekdays[dateValue.value.getDay()]
				}`
			}
			return "请选择日期"
		})
		const timeText = computed(() => {
			if (timeValue.value) {
				return timeValue.value
			}
			return "请选择时间"
		})

		const displayText = computed(() => (dateValue.value && timeValue.value ? `${dateText.value} ${timeText.value}` : ""))

		expose({ displayText })

		const onSelectDate = (date) => {
			dateValue.value = date
		}

		const onTimeChange = ({ selectedValues }) => {
			timeValue.value = selectedValues.join(":")
		}

		const onConfirm = () => {
			let dateString = `${dateValue.value.getFullYear()}/${dateValue.value.getMonth() + 1}/${dateValue.value.getDate()}`

			if (!timeValue.value) {
				dateString += ` 00:00:00`
			} else {
				dateString += ` ${timeValue.value}`
			}

			pickerRef.value.close()

			emit("update:modelValue", new Date(dateString))
		}

		return () => {
			return (
				<PickerWrapper ref={pickerRef} inset={true} disabled={props.disabled || props.readonly}>
					{{
						...pickerSlots(slots, props),
						default: () => [
							<Collapse accordion={true} v-model={activeName.value} border={false} class={"ex-datetime_collapse"}>
								{{
									default: () => [
										<CollapseItem name={"date"} icon={"calendar-o"} value={dateText.value} isLink={false}>
											{{
												title: () => <span style={{ fontWeight: "bold" }}>日期</span>,
												default: () => (
													<div style={{ height: "300px" }}>
														<Calendar
															minDate={minDate}
															maxDate={maxDate}
															showSubtitle={false}
															showConfirm={false}
															poppable={false}
															showTitle={false}
															lazyRender={true}
															rowHeight={36}
															onSelect={onSelectDate}
															{...props.defaultProps.calendarProps}
														></Calendar>
													</div>
												),
											}}
										</CollapseItem>,
										<CollapseItem name={"time"} icon={"clock-o"} isLink={false} value={timeText.value}>
											{{
												title: () => <span style={{ fontWeight: "bold" }}>时间</span>,
												default: () => (
													<div>
														<TimePicker
															showToolbar={false}
															onChange={onTimeChange}
															{...props.defaultProps.timeProps}
														></TimePicker>
													</div>
												),
											}}
										</CollapseItem>,
									],
								}}
							</Collapse>,
							<MpButton type={"primary"} style={{ margin: "20px 0" }} onClick={onConfirm}>
								确定
							</MpButton>,
						],
					}}
				</PickerWrapper>
			)
		}
	},
})
