import type { VbenFormSchema } from '#/adapter/form';
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import type { MesDvMeteringCheckApi } from '#/api/mes/dv/meteringcheck';

import { markRaw } from 'vue';

import { DICT_TYPE } from '@vben/constants';
import { getDictOptions } from '@vben/hooks';

import { getSimpleUserList } from '#/api/system/user';
import { DvMeteringSelect } from '#/views/mes/dv/metering/components';

/** 表单类型 */
export type FormType = 'create' | 'detail' | 'update';

/** 新增/修改计量检测记录的表单 */
export function useFormSchema(): VbenFormSchema[] {
  return [
    {
      fieldName: 'id',
      component: 'Input',
      dependencies: {
        triggerFields: [''],
        show: () => false,
      },
    },
    {
      fieldName: 'meteringId',
      label: '计量器具',
      component: markRaw(DvMeteringSelect),
      componentProps: {
        placeholder: '请选择计量器具',
      },
      help: '选择器具后，其校准周期将用于自动计算下次检测日期',
      rules: 'selectRequired',
    },
    {
      fieldName: 'checkCode',
      label: '检测编号',
      component: 'Input',
      componentProps: {
        placeholder: '请输入检测编号',
      },
      rules: 'required',
    },
    {
      fieldName: 'checkDate',
      label: '检测日期',
      component: 'DatePicker',
      componentProps: {
        class: '!w-full',
        format: 'YYYY-MM-DD',
        placeholder: '请选择检测日期',
        valueFormat: 'YYYY-MM-DD',
      },
      rules: 'required',
    },
    {
      fieldName: 'checkOrg',
      label: '检测机构',
      component: 'Input',
      componentProps: {
        placeholder: '请输入检测机构',
      },
    },
    {
      fieldName: 'checkResult',
      label: '检测结论',
      component: 'RadioGroup',
      componentProps: {
        buttonStyle: 'solid',
        optionType: 'button',
        options: getDictOptions(DICT_TYPE.MES_DV_METERING_CHECK_RESULT, 'number'),
      },
      rules: 'required',
    },
    {
      fieldName: 'certNo',
      label: '证书编号',
      component: 'Input',
      componentProps: {
        placeholder: '请输入证书编号',
      },
    },
    {
      fieldName: 'checkUserId',
      label: '检测人',
      component: 'ApiSelect',
      componentProps: {
        allowClear: true,
        api: getSimpleUserList,
        labelField: 'nickname',
        placeholder: '请选择检测人',
        valueField: 'id',
      },
    },
    {
      fieldName: 'nextCheckDate',
      label: '下次检测日期',
      component: 'DatePicker',
      componentProps: {
        class: '!w-full',
        format: 'YYYY-MM-DD',
        placeholder: '请选择下次检测日期',
        valueFormat: 'YYYY-MM-DD',
      },
      help: '到期日，建议不填：将按「检测日期 + 校准周期」自动计算并回写到器具；也可手动指定',
    },
    {
      fieldName: 'remark',
      label: '备注',
      component: 'Textarea',
      formItemClass: 'col-span-3',
      componentProps: {
        placeholder: '请输入备注',
        rows: 3,
      },
    },
  ];
}

/** 列表的搜索表单 */
export function useGridFormSchema(): VbenFormSchema[] {
  return [
    {
      fieldName: 'meteringId',
      label: '计量器具',
      component: markRaw(DvMeteringSelect),
      componentProps: {
        allowClear: true,
        placeholder: '请选择计量器具',
      },
    },
    {
      fieldName: 'checkCode',
      label: '检测编号',
      component: 'Input',
      componentProps: {
        allowClear: true,
        placeholder: '请输入检测编号',
      },
    },
    {
      fieldName: 'checkResult',
      label: '检测结论',
      component: 'Select',
      componentProps: {
        allowClear: true,
        options: getDictOptions(DICT_TYPE.MES_DV_METERING_CHECK_RESULT, 'number'),
        placeholder: '请选择检测结论',
      },
    },
    {
      fieldName: 'checkDate',
      label: '检测日期',
      component: 'RangePicker',
      componentProps: {
        allowClear: true,
        format: 'YYYY-MM-DD',
        valueFormat: 'YYYY-MM-DD',
      },
    },
  ];
}

/** 列表的字段 */
export function useGridColumns(): VxeTableGridOptions<MesDvMeteringCheckApi.MeteringCheck>['columns'] {
  return [
    {
      field: 'meteringCode',
      title: '器具编码',
      minWidth: 140,
      slots: {
        default: 'meteringCode',
      },
    },
    { field: 'meteringName', title: '器具名称', minWidth: 150 },
    { field: 'checkCode', title: '检测编号', minWidth: 140 },
    {
      field: 'checkDate',
      title: '检测日期',
      width: 120,
      formatter: 'formatDate',
    },
    { field: 'checkOrg', title: '检测机构', minWidth: 140 },
    {
      field: 'checkResult',
      title: '检测结论',
      width: 100,
      cellRender: {
        name: 'CellDict',
        props: { type: DICT_TYPE.MES_DV_METERING_CHECK_RESULT },
      },
    },
    { field: 'certNo', title: '证书编号', minWidth: 130 },
    { field: 'checkUserNickname', title: '检测人', minWidth: 100 },
    {
      field: 'nextCheckDate',
      title: '下次检测日期',
      width: 130,
      formatter: 'formatDate',
    },
    {
      field: 'createTime',
      title: '创建时间',
      width: 180,
      formatter: 'formatDateTime',
    },
    {
      title: '操作',
      width: 200,
      fixed: 'right',
      slots: {
        default: 'actions',
      },
    },
  ];
}
