<template>
  <a-button
    v-if="props.isCreate"
    v-permission="['system:menu:create']"
    type="primary"
    @click="handleClick"
  >
    <template #icon><icon-plus /></template>
    新建
  </a-button>
  <a-button
    v-if="!props.isCreate"
    v-permission="['system:menu:update']"
    type="outline"
    size="small"
    :style="{ marginRight: '10px', padding: '7px' }"
    @click="handleClick"
  >
    <template #icon><icon-edit /></template>
    修改
  </a-button>
  <a-modal
    width="700px"
    :visible="visible"
    @ok="handleSubmit"
    @cancel="handleCancel"
  >
    <template #title>{{ modalTitle }}</template>
    <a-form ref="createEditRef" :model="formData" :style="{ width: '650px' }">
      <a-form-item field="pid" label="父级菜单名称">
        <a-tree-select
          v-model="formData.pid"
          :data="props.menuData"
          :field-names="{
            key: 'id',
            title: 'name',
            children: 'children',
          }"
          :allow-clear="true"
          placeholder="请输入父级菜单名称"
        />
      </a-form-item>
      <a-form-item
        field="type"
        label="类型"
        :validate-trigger="['change', 'input']"
        :rules="[{ required: true, message: '请选择类型' }]"
      >
        <a-select
          v-model="formData.type"
          :options="typeOptions"
          placeholder="请选择类型"
        />
      </a-form-item>
      <a-form-item
        field="name"
        label="名称"
        :validate-trigger="['change', 'input']"
        :rules="[{ required: true, message: '请输入名称' }]"
      >
        <a-input v-model="formData.name" placeholder="请输入名称" />
      </a-form-item>
      <a-form-item
        field="path"
        label="路径"
        :validate-trigger="['change', 'input']"
        :rules="[{ required: true, message: '请输入路径' }]"
      >
        <a-input v-model="formData.path" placeholder="请输入路径" />
      </a-form-item>
      <a-form-item
        field="icon"
        label="图标"
        :validate-trigger="['change', 'input']"
        :rules="[{ required: true, message: '请输入图标' }]"
      >
        <a-input v-model="formData.icon" placeholder="请输入图标" />
      </a-form-item>
      <a-form-item
        field="locale"
        label="应用区域"
        :validate-trigger="['change', 'input']"
        :rules="[{ required: true, message: '应用区域' }]"
      >
        <a-input v-model="formData.locale" placeholder="请输入应用区域" />
      </a-form-item>
      <a-form-item field="requiresAuth" label="认证">
        <a-switch
          v-model="formData.requiresAuth"
          :checked-value="true"
          :unchecked-value="false"
        />
      </a-form-item>
      <a-form-item field="hideInMenu" label="隐藏">
        <a-switch
          v-model="formData.hideInMenu"
          :checked-value="true"
          :unchecked-value="false"
        />
      </a-form-item>
      <a-form-item
        field="menuOrder"
        label="菜单排序"
        :validate-trigger="['change', 'input']"
        :rules="[{ required: true, message: '请选择菜单排序' }]"
      >
        <a-input v-model="formData.menuOrder" placeholder="请输入菜单排序" />
      </a-form-item>
      <a-form-item
        field="permissions"
        label="权限"
        :validate-trigger="['change', 'input']"
        :rules="[{ required: true, message: '请输入权限' }]"
      >
        <a-input v-model="formData.permissions" placeholder="请输入权限" />
      </a-form-item>
    </a-form>
  </a-modal>
</template>

<script lang="ts" setup>
  import useVisible from '@/hooks/visible';
  import { computed, PropType, ref } from 'vue';
  import { FormInstance } from '@arco-design/web-vue/es/form';
  import { Message } from '@arco-design/web-vue';
  import {
    createMenu,
    MenuRecord,
    MenuUpdateRecord,
    queryMenuDetail,
    updateMenu,
  } from '@/api/menu';

  const props = defineProps({
    menuData: {
      type: Object as PropType<MenuRecord>,
    },
    isCreate: Boolean,
    id: {
      type: Number,
      default: -1,
    },
  });
  const modalTitle = computed(() => {
    return props.isCreate ? '新建菜单' : '编辑菜单';
  });
  const { visible, setVisible } = useVisible(false);
  const createEditRef = ref<FormInstance>();

  const formData = ref<MenuUpdateRecord>({
    type: '',
    name: '',
    path: '',
    locale: '',
    icon: '',
    requiresAuth: true,
    hideInMenu: false,
    menuOrder: 0,
    permissions: '',
  });
  const typeOptions = computed(() => [
    {
      label: '页面',
      value: 'PAGE',
    },
    {
      label: '操作',
      value: 'OPERATION',
    },
  ]);

  const emit = defineEmits(['refresh']);

  // 组件被点击
  const handleClick = () => {
    setVisible(true);
    if (!props.isCreate) {
      queryMenuDetail(props.id).then((res) => {
        formData.value = res.data;
      });
    }
  };

  // 提交
  const handleSubmit = async () => {
    const valid = await createEditRef.value?.validate();
    if (!valid) {
      // 新增
      if (props.isCreate) {
        const res = await createMenu(formData.value);
        if (res.status === 200) {
          Message.success({
            content: '新建成功',
            duration: 5 * 1000,
          });
        }
        createEditRef.value?.resetFields();
      } else {
        // 编辑
        const res = await updateMenu(formData.value);
        if (res.status === 200) {
          Message.success({
            content: '修改成功',
            duration: 5 * 1000,
          });
        }
      }
      emit('refresh');
      setVisible(false);
    }
  };

  // 关闭
  const handleCancel = async () => {
    createEditRef.value?.resetFields();
    setVisible(false);
  };
</script>