<template>
  <el-date-picker v-model="model"> </el-date-picker>
</template>

<script setup lang="ts">
import { ElDatePicker } from "element-plus";
import dayjs, { type Dayjs } from "dayjs";
import { nextTick, toRef, watch, watchEffect } from "vue";
import { watchEffectOnce } from "../../../plugs/composables";

interface Props {
  valueType: "iso8601" | "unix" | "unixMillis";
  tz?: string;
  keepMillis?: boolean;
}

const props = defineProps<Props>();

watchEffectOnce(toRef(props, "tz"), async () => {
  const timeZone = await import("dayjs/plugin/timezone");
  dayjs.extend(timeZone.default);
});

const model = defineModel<string | number, string, Date, Date>({
  get: (value) => {
    let dt: Dayjs;
    if (props.valueType === "unix" || props.valueType === "unixMillis") {
      if (typeof value === "string") {
        value = parseFloat(value);
      }
      dt = props.valueType === "unix" ? dayjs.unix(value) : dayjs(value);
    } else {
      dt = dayjs(value);
    }

    return dt.toDate();
  },
  set: (value) => {
    const dt = dayjs(value);
    if (props.valueType === "unix") {
      return dt.unix();
    } else if (props.valueType === "unixMillis") {
      return dt.valueOf();
    } else if (props.valueType === "iso8601" && props.tz) {
      const fmt = props.keepMillis ? "YYYY-MM-DDTHH:mm:ss.SSSZ" : "YYYY-MM-DDTHH:mm:ssZ";
      return dt.tz(props.tz).format(fmt);
    } else {
      const isoWithMillis = dt.toISOString();
      if (props.keepMillis) return isoWithMillis;
      else return isoWithMillis.slice(0, 19).concat("Z");
    }
  },
});
</script>
