<script setup lang="ts">
import type { TSimChannelsModel } from '#/api/iotlcm/tChannel/tSimChannels/type';

import { computed, ref } from 'vue';

import { useVbenModal } from '@vben/common-ui';
import { $t } from '@vben/locales';

import { message } from 'ant-design-vue';

import { useVbenForm } from '#/adapter/form';
import { Edit, View } from '#/api/iotlcm/tChannel/tSimChannels';
import BetterVben from '#/constants/BetterVben';

import { EditFormSchema } from './model';

/** ====================  类型  ==================== */
interface ModalProps {
  data: TSimChannelsModel;
  isUpdate: boolean;
}

/** ====================  常量  ==================== */
const emit = defineEmits<{ confirm: [] }>();

/** ====================  数据  ==================== */
const isUpdate = ref(false);
const title = computed(() => {
  return isUpdate.value ? $t('pages.common.edit') : $t('pages.common.add');
});
/** ====================  方法  ==================== */
async function handleOpen() {
  const data = modalApi.getData() as ModalProps;
  isUpdate.value = data.isUpdate;
  if (data.isUpdate) {
    try {
      const res = await View({ id: data.data.id });
      await formApi.setValues(res);
    } catch (error) {
      message.error('数据加载失败');
      console.error(error);
    }
  }
}

async function handleConfirm() {
  try {
    const [flag, value] = await BetterVben.function.formValidate(formApi);
    if (flag) {
      await BetterVben.function.formSubmit(
        Edit(value as TSimChannelsModel),
        modalApi,
        {
          autoClose: true,
          successMessage: '操作成功',
          emit: () => {
            emit('confirm');
          },
        },
      );
    }
  } catch (error) {
    console.error(error);
  }
}

async function handleCancel() {
  modalApi.close();
  await formApi.resetForm();
}
/** ====================  组件  ==================== */
const [Form, formApi] = useVbenForm({
  ...BetterVben.form.default,
  schema: EditFormSchema,
});

const [Modal, modalApi] = useVbenModal({
  ...BetterVben.modal.default,
  onCancel: handleCancel,
  async onConfirm() {
    await BetterVben.function.modalAutoLoadAsync(modalApi, async () => {
      await handleConfirm();
    });
  },
  async onOpenChange(isOpen) {
    if (!isOpen) {
      return null;
    }
    await BetterVben.function.modalAutoLoadAsync(modalApi, async () => {
      await handleOpen();
    });
  },
});
</script>
<template>
  <Modal :title="title">
    <Form />
  </Modal>
</template>
