<template>
  <a-modal v-model:open="visible" :width="334" centered>
    <template #title> 填涂区设置 </template>

    <a-form
      ref="formRef"
      :model="formData"
      :rules="rules"
      :label-col="{ style: { width: '60px' } }"
    >
      <a-form-item label="未填涂">
        <div
          class="color-block color-unfill"
          :style="{ backgroundColor: formData.unfillColor }"
          @click="onEditColor('unfillColor')"
        ></div>
        <a-checkbox v-model:checked="formData.unfillShow">显示</a-checkbox>
      </a-form-item>
      <a-form-item label="已填涂">
        <div
          class="color-block color-fill"
          :style="{ backgroundColor: formData.fillColor }"
          @click="onEditColor('fillColor')"
        ></div>
        <a-checkbox v-model:checked="formData.fillShow">显示</a-checkbox>
      </a-form-item>
      <a-form-item name="borderWidth" label="宽度">
        <a-input-number
          v-model:value="formData.borderWidth"
          style="width: 40px; margin-right: 4px"
          :min="1"
          :max="9"
          :precision="0"
          :controls="false"
        />
        <span class="input-tips">像素</span>
      </a-form-item>
    </a-form>

    <template #footer>
      <div class="box-justify">
        <a-button type="link" @click="initSet">恢复默认值</a-button>

        <div>
          <a-button type="text" @click="close">取消</a-button>
          <a-button type="primary" @click="confirm">确认</a-button>
        </div>
      </div>
    </template>
  </a-modal>

  <ColorPickerDialog
    ref="colorPickerDialogRef"
    :color="curColor"
    @confirm="onColorConfirm"
  />
</template>

<script setup lang="ts">
import { reactive, ref, watch, UnwrapRef } from "vue";
import { message } from "ant-design-vue";

import useModal from "@/hooks/useModal";
import { useUserStore } from "@/store";
import { objModifyAssign } from "@/utils/tool";

import ColorPickerDialog from "./ColorPickerDialog.vue";

defineOptions({
  name: "FillAreaSetDialog",
});

/* modal */
const { visible, open, close } = useModal();
defineExpose({ open, close });

const userStore = useUserStore();

const defaultFormData = {
  fillColor: "#f53f3f",
  fillShow: true,
  unfillColor: "#165DFF",
  unfillShow: false,
  borderWidth: 2,
};

const emit = defineEmits(["modified"]);

type FormDataType = typeof defaultFormData;
const formRef = ref();
const formData: UnwrapRef<FormDataType> = reactive({
  ...defaultFormData,
});
const rules: FormRules<keyof FormDataType> = {
  borderWidth: [
    {
      required: true,
      message: "请输入",
      trigger: "change",
    },
  ],
};

function initSet() {
  objModifyAssign(formData, defaultFormData);
}

async function confirm() {
  const valid = await formRef.value?.validate().catch(() => false);
  if (!valid) return;

  userStore.setRecogFillSet(formData);

  message.success("保存成功!");
  emit("modified", formData);
  close();
}

// color picker
type EditType = "fillColor" | "unfillColor";
const curColor = ref("");
const colorPickerDialogRef = ref();
const editType = ref<EditType>("fillColor");
function onEditColor(type: EditType) {
  curColor.value =
    type === "fillColor" ? formData.fillColor : formData.unfillColor;
  editType.value = type;
  colorPickerDialogRef.value?.open();
}

function onColorConfirm(val: string) {
  if (editType.value === "fillColor") {
    formData.fillColor = val;
  } else {
    formData.unfillColor = val;
  }
}

/* init modal */
watch(
  () => visible.value,
  (val) => {
    if (val) {
      modalOpenHandle();
    }
  },
  {
    immediate: true,
  }
);

function modalOpenHandle() {
  objModifyAssign(formData, userStore.recogFillSet || defaultFormData);
}
</script>

<style lang="less" scoped>
.color-block {
  display: inline-block;
  vertical-align: middle;
  width: 32px;
  height: 32px;
  border-radius: 6px;
  margin-right: 8px;
  cursor: pointer;

  &:hover {
    opacity: 0.8;
  }
}
.input-tips {
  display: inline-block;
  vertical-align: middle;
  margin-top: 3px;
}
</style>