<template>
	<view class="hd-count-down">
		<view v-if="showDay" class="hd-count-down-number" :style="{
        borderColor: borderColor,
        color: color,
        background: backgroundColor
      }">
			{{ d }}
		</view>
		<view v-if="showDay" class="hd-count-down-splitor" :style="{ color: splitorColor }">天</view>
		<view class="hd-count-down-number" :style="{
        borderColor: borderColor,
        color: color,
        background: backgroundColor
      }">
			{{ h }}
		</view>
		<view class="hd-count-down-splitor" :style="{ color: splitorColor }">
			{{ showColon ? ':' : '时' }}
		</view>
		<view class="hd-count-down-number" :style="{
        borderColor: borderColor,
        color: color,
        background: backgroundColor
      }">
			{{ m }}
		</view>
		<view class="hd-count-down-splitor" :style="{ color: splitorColor }">
			{{ showColon ? ':' : '分' }}
		</view>
		<view class="hd-count-down-number" :style="{
        borderColor: borderColor,
        color: color,
        background: backgroundColor
      }">
			{{ s }}
		</view>
		<view v-if="!showColon" class="hd-count-down-splitor" :style="{ color: splitorColor }">秒</view>
	</view>
</template>
<script setup lang="ts">
	import { onBeforeMount, onBeforeUnmount, ref } from 'vue'

	/**
	 * CountDown 倒计时
	 */

	interface Props {
		// 控制展示天
		showDay ?: boolean
		// 是否展示分隔符
		showColon ?: boolean
		// 背景色
		backgroundColor ?: string
		// 边框颜色
		borderColor ?: string
		// 字体颜色
		color ?: string
		// 分隔符颜色
		splitorColor ?: string
		// 日
		day ?: number
		// 时
		hour : number
		// 分
		minute : number
		// 秒
		second : number
	}

	const props = withDefaults(defineProps<Props>(), {
		// 控制展示天
		showDay: true,
		// 是否展示分隔符
		showColon: true,
		// 背景色
		backgroundColor: '#FFFFFF',
		// 边框颜色
		borderColor: '#000000',
		// 字体颜色
		color: '#000000',
		// 分隔符颜色
		splitorColor: '#FFFFFF',
		// 日
		day: 0,
		// 时
		hour: 0,
		// 分
		minute: 0,
		// 秒
		second: 0
	})

	const timer = ref<any>(null)
	const d = ref<string>('00')
	const h = ref<string>('00')
	const m = ref<string>('00')
	const s = ref<string>('00')
	const leftTime = ref<number>(0)
	const seconds = ref<number>(0)

	onBeforeMount(() => {
		seconds.value = toSeconds(props.day, props.hour, props.minute, props.second)
		countDown()
		timer.value = setInterval(() => {
			seconds.value--
			if (seconds.value < 0) {
				timeUp()
				return
			}
			countDown()
		}, 1000)
	})

	onBeforeUnmount(() => {
		timer.value && clearInterval(timer.value)
	})

	const emit = defineEmits(['timeup'])

	/**
	 * 时间转秒
	 * @param day  日
	 * @param hours 时
	 * @param minutes 分
	 * @param seconds 秒
	 */
	function toSeconds(day : number, hours : number, minutes : number, seconds : number) {
		return day * 60 * 60 * 24 + hours * 60 * 60 + minutes * 60 + seconds
	}
	/**
	 * 倒计时结束
	 */
	function timeUp() {
		timer.value && clearInterval(timer.value)
		// 倒计时结束时触发
		emit('timeup')
	}

	/**
	 * 倒计时
	 */
	function countDown() {
		let [day, hour, minute, second] = [0, 0, 0, 0]
		if (seconds.value > 0) {
			day = Math.floor(seconds.value / (60 * 60 * 24))
			hour = Math.floor(seconds.value / (60 * 60)) - day * 24
			minute = Math.floor(seconds.value / 60) - day * 24 * 60 - hour * 60
			second = Math.floor(seconds.value) - day * 24 * 60 * 60 - hour * 60 * 60 - minute * 60
		} else {
			timeUp()
		}
		d.value = day < 10 ? `0${day}` : `${day}`
		h.value = hour < 10 ? `0${hour}` : `${hour}`
		m.value = minute < 10 ? `0${minute}` : `${minute}`
		s.value = second < 10 ? `0${second}` : `${second}`
	}
</script>
<style lang="scss" scoped>
	.hd-count-down {
		padding: 1px 0;
		display: flex;
		flex-wrap: nowrap;
		justify-content: center;
		align-items: center;

		&-splitor {
			justify-content: center;
			line-height: 20px;
			padding: 0 0;
			font-size: 12px;
			box-sizing: border-box;
		}

		&-number {
			line-height: 20px;
			justify-content: center;
			height: 20px;
			border-radius: 50%;
			margin: 0 2.5px;
			font-size: 12px;
			width: 20px;
			text-align: center;
			box-sizing: border-box;
		}
	}
</style>