<script lang="ts" setup>
import { onMounted, ref, reactive, computed } from 'vue';
import { date } from 'quasar';

interface Props {
  modelValue: string;
  format24h?: boolean;
  withSeconds?: boolean;
}
const props = withDefaults(defineProps<Props>(), {
  modelValue: date.formatDate(Date.now(), 'YYYY/MM/DD HH:mm'),
  format24h: false,
  withSeconds: false,
});

const emit = defineEmits<{
  (e: 'update:modelValue', value: string): void;
}>();

const dates = computed({
  set(value: string) {
    emit('update:modelValue', value);
  },
  get() {
    return props.modelValue;
  },
});

const timeMask = computed(() => {
  if (props.withSeconds) {
    return 'HH:mm:ss';
  } else {
    return 'HH:mm';
  }
});

const dateRules = computed(() => {
  let dateRegular: RegExp;
  if (props.withSeconds) {
    dateRegular =
      /^-?[\d]+\/[0-1]\d\/[0-3]\d ([0-1]?\d|2[0-3]):[0-5]\d:[0-5]\d$/;
  } else {
    dateRegular = /^-?[\d]+\/[0-1]\d\/[0-3]\d (\d{2}):(\d{2})$/;
  }
  return [(v: string) => dateRegular.test(v)];
});

const dateProxyDate = ref('');
const timeProxyDate = ref('');
const dateLocale = reactive({
  daysShort: '六_日_一_二_三_四_五'.split('_'),
  months:
    '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split(
      '_'
    ),
  monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
  firstDayOfWeek: 1,
  format24h: true,
  pluralDay: 'dias',
});

onMounted(() => {
  getNowDate();
});

function getNowDate() {
  dateProxyDate.value = date.formatDate(Date.now(), 'YYYY/MM/DD');
  timeProxyDate.value = date.formatDate(Date.now(), timeMask.value);
}

function updateProxy() {
  const _dates = dates.value;
  const dateArr = _dates.split(' ');

  dateProxyDate.value = dateArr[0];
  timeProxyDate.value = dateArr[1];
}

function onClickDate() {
  const datesStr = `${dateProxyDate.value} ${timeProxyDate.value}`;
  dates.value = datesStr;
}
</script>
<template>
  <div class="hcy-datetime-pick">
    <q-input filled dense v-model="dates" :rules="dateRules">
      <template v-slot:append>
        <q-icon name="event" class="cursor-pointer">
          <q-popup-proxy
            @before-show="updateProxy"
            transition-show="scale"
            transition-hide="scale"
            class="row"
          >
            <q-date
              flat
              square
              minimal
              v-model="dateProxyDate"
              :locale="dateLocale"
              mask="YYYY/MM/DD"
              class="my-date"
            >
            </q-date>
            <q-time
              flat
              square
              v-model="timeProxyDate"
              :mask="timeMask"
              :format24h="format24h"
              :with-seconds="withSeconds"
              text-color="primary"
              class="my-time"
            >
              <div class="row items-center justify-end q-gutter-sm">
                <q-btn
                  label="此刻"
                  size="sm"
                  color="primary"
                  flat
                  @click="getNowDate"
                />
                <q-btn
                  unelevated
                  label="确定"
                  size="sm"
                  color="primary"
                  @click="onClickDate"
                  v-close-popup
                />
              </div>
            </q-time>
          </q-popup-proxy>
        </q-icon>
      </template>
    </q-input>
  </div>
</template>

<style lang="scss" scoped>
.my-date {
  :deep(.q-date__main .q-date__content .q-date__view .q-date__navigation) {
    > .relative-position {
      color: $primary;
    }
  }
}
.my-time {
  :deep(.q-time__header) {
    background-color: white;
  }
  :deep(.q-time__main
      .q-time__content
      .q-time__container-child
      .q-time__clock
      .q-time__clock-circle
      .q-time__clock-position--active) {
    color: white !important;
  }
}
</style>